C#实现给图片添加文字水印的示例代码

 更新时间:2024年04月18日 14:48:01   作者:初九之潜龙勿用  
在某些应用项目中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息,下面我们就来看看如何使用C#实现给图片添加文字水印吧

应用场景

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

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# 自动填充文字内容到指定图片》

到此这篇关于C#实现给图片添加文字水印的示例代码的文章就介绍到这了,更多相关C#图片添加文字水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C# 泛型中的数据类型判定与转换

    详解C# 泛型中的数据类型判定与转换

    这篇文章主要介绍了C# 泛型中的数据类型判定与转换,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#实现飞行棋项目

    C#实现飞行棋项目

    这篇文章主要为大家详细介绍了C#实现飞行棋项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C#中增强类功能的几种方式详解

    C#中增强类功能的几种方式详解

    这篇文章主要给大家介绍了关于C#中增强类功能的几种方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2018-12-12
  • C# winform主界面打开并关闭登录界面的方法

    C# winform主界面打开并关闭登录界面的方法

    这篇文章主要介绍了C# winform主界面打开并关闭登录界面的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • C#调用摄像头实现拍照功能的示例代码

    C#调用摄像头实现拍照功能的示例代码

    这篇文章主要介绍了C#调用摄像头实现拍照功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Unity2021发布WebGL与网页交互问题的解决

    Unity2021发布WebGL与网页交互问题的解决

    本文主要介绍了Unity2021发布WebGL与网页交互问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C#实现文件压缩与解压的方法示例【ZIP格式】

    C#实现文件压缩与解压的方法示例【ZIP格式】

    这篇文章主要介绍了C#实现文件压缩与解压的方法,结合具体实例形式分析了C#针对文件进行zip格式压缩与解压缩的相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • c# 断点续传的实现

    c# 断点续传的实现

    这篇文章主要介绍了c# 断点续传的实现,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • c#中executereader执行查询示例分享

    c#中executereader执行查询示例分享

    这篇文章主要介绍了c#中executereader执行查询示例,需要的朋友可以参考下
    2014-04-04
  • C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法,需要的朋友可以参考一下
    2013-04-04

最新评论