当前位置:首页 » 《休闲阅读》 » 正文

C# 给图片添加文字水印

22 人参与  2024年04月26日 10:05  分类 : 《休闲阅读》  评论

点击全文阅读


目录

应用场景

开发运行环境

方法说明

方法代码

调用示例 

小结


应用场景

在某些应用项目(如电子档案信息管理)中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。增加水印主要起到如下作用:

1、防止盗图:图片加水印可以有效防止盗图,将文字水印嵌入到图片中作为特殊标记,可以在不影响图片质量的情况下保护版权,即使别人下载了图片,也可以通过水印追踪到图片的来源。

2、增加宣传效果:可以通过添加URL或其它宣传性文字,增加宣传效果。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

方法说明

AddWaterText 方法无返回值,具体参数说明请参照下表:

序号参数名类型说明
1oldpathstring原图片文件路径
2textstring要添加的水印文字
3newpathstring新输出图片文件路径
4pointobject设置文字起始位置坐标
5fontSystem.Drawing.Font设置文字的字体
6colorSystem.Drawing.Color

设置文字的颜色

可使用 System.Drawing.Color.FromArgb(alpha, r, g, b)方法添加滤镜效果

7rotatefloat旋转角度值,默认值为 0.0f
8textWidthint文本预估宽度,默认值为1
9textHeightint文本预估高度,默认值为1
10repeatDint多水印文本间距值,默认值为0

方法代码

public void AddWaterText(string oldpath, string text, string newpath, object point, System.Drawing.Font font, System.Drawing.Color color, float rotate = 0.0f, int textWidth = 1,int textHeight=1, int repeatD=0){try{FileStream fs = new FileStream(oldpath, FileMode.Open);BinaryReader br = new BinaryReader(fs);byte[] bytes = br.ReadBytes((int)fs.Length);br.Close();fs.Close();MemoryStream ms = new MemoryStream(bytes);System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);int imgPhotoWidth = imgPhoto.Width;int imgPhotoHeight = imgPhoto.Height;Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);bmPhoto.SetResolution(72, 72);Graphics gbmPhoto = Graphics.FromImage(bmPhoto);gbmPhoto.Clear(Color.FromName("white"));gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;gbmPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, imgPhotoWidth, imgPhotoHeight), 0, 0, imgPhotoWidth, imgPhotoHeight, GraphicsUnit.Pixel);System.Drawing.SizeF crSize = new SizeF();crSize = gbmPhoto.MeasureString(text, font);float y = imgPhotoHeight - crSize.Height;float x = imgPhotoWidth - crSize.Width;System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();StrFormat.Alignment = System.Drawing.StringAlignment.Center;if(point!=null){System.Drawing.Point newpos=((System.Drawing.Point)point);x=newpos.X;y=newpos.Y;}System.Drawing.SolidBrush semiTransBrush = new System.Drawing.SolidBrush(color);System.Drawing.Color.FromArgb(1,1,1,1);                gbmPhoto.RotateTransform(rotate);                if (repeatD == 0)                {                    gbmPhoto.DrawString(text, font, semiTransBrush, x, y);                }                else                {                    int xcount = imgPhotoWidth/textWidth+3;                    int ycount = imgPhotoHeight/textHeight+3;                    float ox = x;                    for (int k = 0; k < ycount; k++)                    {                        for (int i = 0; i < xcount; i++)                        {                            for (int j = 0; j < xcount; j++)                            {                                gbmPhoto.DrawString(text, font, semiTransBrush, x, y);                            }                            x += textWidth+repeatD;                        }                        x = ox;                        y += textHeight+repeatD;                    }                }bmPhoto.Save(newpath, System.Drawing.Imaging.ImageFormat.Jpeg);gbmPhoto.Dispose();imgPhoto.Dispose();bmPhoto.Dispose();}catch{               ;               }}

调用示例 

//获取源图片文件路径string tempfile=Request.PhysicalApplicationPath+"\\app_data\\test.jpg";//设置文字位置System.Drawing.Point point = new System.Drawing.Point();point.X = -10;point.Y = -100;//设置字体类System.Drawing.Font font = new System.Drawing.Font("微软雅黑", 19, System.Drawing.FontStyle.Bold);//设置字体滤镜值 ,和RGB分量颜色int alpha = 25; int r = 255; int g = 0; int b = 255;System.Drawing.Color color = System.Drawing.Color.FromArgb(alpha, r, g, b); float rotate=30.0f; // 旋转角度int textWidth = 100; //文本预估宽度int textHeight=30; //文本预估高度int repeatD=100; // 多水印文本间距,则表示多水印输出//添加水印文字string text="版权所有";AddWaterText(tempfile,text,tempfile, point, font, color,rotate,textWidth,textHeight,repeatD);File.Delete(tempfile);  //删除释放文件,在些之前可执行显示操作,如获取base64编码

显示效果如下图:

小结

AddWaterText 方法需要根据您实际应用中的图片大小动态调整参数,以达到满意的显示效果,如果文字起始位置,字体大小,水印间距等。您也可以改造本方法或应用,自动适应调整参数值。

调用示例中新旧图片文件输出为同一文件,然后删除释放文件所占用磁盘的空间,因此我们想要正确显示图片在浏览器的话,需要在删除文件前获取图片的Base64编码即可,如何获取base64数据的方法请参照我的文章:《C# 自动填充文字内容到指定图片》

感谢您的阅读,希望本文能够对您有所帮助。


点击全文阅读


本文链接:http://zhangshiyu.com/post/100358.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1