首页 > 编程语言 >通过C#给图片添加水印

通过C#给图片添加水印

时间:2024-05-31 14:00:09浏览次数:14  
标签:imgPhotoHeight crSize C# 水印 int 添加 new gbmPhoto

近日有图片通过C#加水印的需求,在网上搜到了这个:https://www.jb51.net/program/319824nmi.htm
但是提供的代码有不少问题。经过分析和修改,整理为了这样的代码:
oldpath为原图片路径,newpath为保存到的图片路径。text为水印文字内容。rotate是以°为单位的角度,repeatD是垂直或水平相邻两次水印的间隔像素(设置为0时只显示一次文字),Trans是水印的透明度。
因为用不到90度的文字,所以只对Math.tan(π/2)报了异常。
源代码中的textWidth 、textHeight几乎是干扰项,实际上制作水印是根据MeasureString(text, font)来计算水印文字的长宽的,xcount和ycount也应该根据此长宽调整数量,而不是固定的+3。
此代码已经在项目中实际使用。
` public void AddWaterText(string oldpath, string text, string newpath, System.Drawing.Font font, Color color, float rotate = 15.0f, int repeatD = 50,int Trans=128)
{
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);

		Image imgPhoto = Image.FromStream(ms);
		int imgPhotoWidth = imgPhoto.Width;
		int imgPhotoHeight = imgPhoto.Height;

		Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, PixelFormat.Format24bppRgb);

		bmPhoto.SetResolution(72, 72);
		Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
		gbmPhoto.Clear(Color.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);
		SizeF crSize = gbmPhoto.MeasureString(text, font);
		float y = 0;
		float x = 0; 

		StringFormat StrFormat = new StringFormat();
		StrFormat.Alignment = StringAlignment.Center;

		SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(Trans, color.R, color.G, color.B));
		gbmPhoto.RotateTransform(rotate);
		if (repeatD == 0)
		{
			gbmPhoto.DrawString(text, font, semiTransBrush, x, y);
		}
		else
		{
			double arc = rotate / 180 * Math.PI;//弧度
			if(double.IsInfinity(Math.Tan(arc))) throw new Exception("不允许90度设置水印");
			y =(int)(Math.Tan(arc) * imgPhotoWidth);//从这里开始,水印才能覆盖到图像的右上角
			int ycount = (int)(imgPhotoHeight / crSize.Height);
			ycount += (int)(2 * y / crSize.Height);//使得正向和反向都能用上
			y = -y;

			x = (int)(imgPhotoHeight / Math.Tan(arc));
			int xcount = (int)(imgPhotoWidth / crSize.Width) + 3;
			xcount += (int)(2 * x / crSize.Width);
			x = -x;

			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 += crSize.Width + repeatD;
				}
				x = ox;
				y += crSize.Height + repeatD;
			}
		}
		bmPhoto.Save(newpath);//怎么原代码全存jpg了
		gbmPhoto.Dispose();
		imgPhoto.Dispose();
		bmPhoto.Dispose();
	}

`

希望越来越多的开发者在面向百度编程,借用各种博客代码后,能想起来分享一些自己的代码~

标签:imgPhotoHeight,crSize,C#,水印,int,添加,new,gbmPhoto
From: https://www.cnblogs.com/hoshitani/p/18224416

相关文章

  • PCB 板上为什么要进行沉金和镀金?-健翔升pcb
    沉金和镀金的作用1.提高导电性沉金和镀金都是为了提高电路板的导电性能。金是一种极好的导电材料,尽管它的成本较高,但在电路板的关键部位使用金涂层可以显著提升电流的传输效率。2.防止氧化金的另一个优点是不会像铜那样容易氧化。这意味着经过金处理的PCB在长期暴露于空......
  • Chrom 如何禁用JS
    想复制网页上的文字,弹出需要登录等,很烦人。打开开发者工具按F12打开浏览器操作打开禁用JS运行命令按Ctrl+Shift+P或者如下图,鼠标点击,调出命令运行窗口在运行窗口中输入JavaScript点击停用,同理,再次点击,开启鼠标操作......
  • mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版
    ShareMouse是一款跨平台的键盘和鼠标共享软件,它允许用户在多台计算机之间共享同一组键盘和鼠标,实现无缝的操作和控制。该软件适用于Windows和macOS系统,并且支持多种连接方式,包括局域网连接和无线连接。使用ShareMouse,用户可以轻松地在多台计算机之间切换和操作,而无......
  • 2024前端react面试题
    css相关1.单行文本溢出显示省略号设置什么属性{overflow:hidden,text-overflow:ellipsis,white-space:nowrap}2.简素述盒子模型Box-sizing:context-box(正常盒子),border-box(ie盒子)Content-box:盒子的大小=设置的width,height+border+padding+marginborder-box:盒子大小=设置......
  • 人工智能降噪软件:Topaz Photo AI for Mac/win 激活版
    TopazPhotoAI是一款由TopazLabs公司推出的图像处理软件,它利用人工智能技术来提供高质量的图像编辑和增强功能。该软件可以帮助用户快速、轻松地改善照片质量,包括降噪、增强细节、改善色彩和对比度等。它还具有智能修复功能,可以帮助修复老照片或受损照片的细节和色彩......
  • nuget添加readme
    提问nuget如何添加readme回答目录csproj其他nuget最佳实践https://learn.microsoft.com/en-us/nuget/create-packages/package-authoring-best-practices......
  • 关于Nginx 的 location 匹配规则总结
    Nginx版本:1.18.0location匹配的变量Nginx的location规则匹配的变量是 $uri,所以不用管后面的参数 $query_string (或者 $args)location匹配的种类格式主要是这个:location[空格|=|~|~*|^~|@]/uri/{...}其实上面分为三部分:最前面的字符(l......
  • vue 导出xlsx (报错./cptable in ./node modules/xlsx-style/dist/cpexcel.js)
    安装 xlsx 和  xlsx-stylesrc下创建文件夹utils, utils文件夹下创建index.js文件,index.js文件内容如下:*CreatedbyAnqion16/11/18.*//***Parsethetimetostring*@param{(Object|string|number)}time*@param{string}cFormat*@returns{stri......
  • ZCMU-1144
    简单问题:就只是如何降低时间的问题罢了:本来这种方法以前学过但是没怎么用所以不太灵活、#include<stdio.h>#definemaxn1000010intsum[maxn]={0};voidSum(){ for(inti=1;i<=maxn;i++){for(intj=i;j<=maxn;j+=i){sum[j]++;//表示......
  • 【JavaScript脚本宇宙】编程新视野:JavaScript中的六大重要实用库
    增强你的代码:深入浅出JavaScript实用工具库前言在动态且多变的编程世界中,实用程序库已经成为开发者们提升效率、优化代码的得力助手。本文将深入探讨六个广受欢迎的JavaScript实用程序库,它们各自具有独特的功能和应用场景,无论你是初学者还是资深开发者,或许都能在其中找到......