c# 图片加水印
2024-10-15 12:43:26
/// <summary> /// 图片水印 /// </summary> /// <param name="imgPath">服务器图片相对路径</param> /// <param name="filename">保存文件名</param> /// <param name="watermarkFilename">水印文件相对路径</param> /// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下</param> /// <param name="quality">附加水印图片质量,0-100</param> /// <param name="watermarkTransparency">水印的透明度 1--10 10为不透明</param> public static void AddImageSignPic(string imgPath, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency) { if (!File.Exists(Utils.GetMapPath(imgPath))) return; byte[] _ImageBytes = File.ReadAllBytes(Utils.GetMapPath(imgPath)); Image img = Image.FromStream(new System.IO.MemoryStream(_ImageBytes)); filename = Utils.GetMapPath(filename); if (watermarkFilename.StartsWith("/") == false) watermarkFilename = "/" + watermarkFilename; watermarkFilename = Utils.GetMapPath(watermarkFilename); if (!File.Exists(watermarkFilename)) return; Graphics g = Graphics.FromImage(img); //设置高质量插值法 //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; Image watermark = new Bitmap(watermarkFilename); if (watermark.Height >= img.Height || watermark.Width >= img.Width) return; ImageAttributes imageAttributes = new ImageAttributes(); ColorMap colorMap = new ColorMap(); colorMap.OldColor = Color.FromArgb(, , , ); colorMap.NewColor = Color.FromArgb(, , , ); ColorMap[] remapTable = { colorMap }; imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap); float transparency = 0.5F; && watermarkTransparency <= ) transparency = (watermarkTransparency / 10.0F); float[][] colorMatrixElements = { new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f}, new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f}, new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f}, new float[] {0.0f, 0.0f, 0.0f, transparency, 0.0f}, new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f} }; ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements); imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); ; ; switch (watermarkStatus) { : xpos = (); ypos = (); break; : xpos = () - (watermark.Width / )); ypos = (); break; : xpos = () - (watermark.Width)); ypos = (); break; : xpos = (); ypos = () - (watermark.Height / )); break; : xpos = () - (watermark.Width / )); ypos = () - (watermark.Height / )); break; : xpos = () - (watermark.Width)); ypos = () - (watermark.Height / )); break; : xpos = (); ypos = () - watermark.Height); break; : xpos = () - (watermark.Width / )); ypos = () - watermark.Height); break; : xpos = () - (watermark.Width)); ypos = () - watermark.Height); break; } g.DrawImage(watermark, , , watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes); ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo ici = null; foreach (ImageCodecInfo codec in codecs) { ) ici = codec; } EncoderParameters encoderParams = new EncoderParameters(); ]; || quality > ) quality = ; qualityParam[] = quality; EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam); encoderParams.Param[] = encoderParam; if (ici != null) img.Save(filename, ici, encoderParams); else img.Save(filename); g.Dispose(); img.Dispose(); watermark.Dispose(); imageAttributes.Dispose(); }
/// <summary> /// 文字水印 /// </summary> /// <param name="imgPath">服务器图片相对路径</param> /// <param name="filename">保存文件名</param> /// <param name="watermarkText">水印文字</param> /// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下</param> /// <param name="quality">附加水印图片质量,0-100</param> /// <param name="fontname">字体</param> /// <param name="fontsize">字体大小</param> public static void AddImageSignText(string imgPath, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize) { byte[] _ImageBytes = File.ReadAllBytes(Utils.GetMapPath(imgPath)); Image img = Image.FromStream(new System.IO.MemoryStream(_ImageBytes)); filename = Utils.GetMapPath(filename); Graphics g = Graphics.FromImage(img); Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel); SizeF crSize; crSize = g.MeasureString(watermarkText, drawFont); ; ; switch (watermarkStatus) { : xpos = (; ypos = (; break; : xpos = (() - (crSize.Width / ); ypos = (; break; : xpos = (() - crSize.Width; ypos = (; break; : xpos = (; ypos = (() - (crSize.Height / ); break; : xpos = (() - (crSize.Width / ); ypos = (() - (crSize.Height / ); break; : xpos = (() - crSize.Width; ypos = (() - (crSize.Height / ); break; : xpos = (; ypos = (() - crSize.Height; break; : xpos = (() - (crSize.Width / ); ypos = (() - crSize.Height; break; : xpos = (() - crSize.Width; ypos = (() - crSize.Height; break; } g.DrawString(watermarkText, drawFont, , ypos + ); g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos); ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo ici = null; foreach (ImageCodecInfo codec in codecs) { ) ici = codec; } EncoderParameters encoderParams = new EncoderParameters(); ]; || quality > ) quality = ; qualityParam[] = quality; EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam); encoderParams.Param[] = encoderParam; if (ici != null) img.Save(filename, ici, encoderParams); else img.Save(filename); g.Dispose(); img.Dispose(); }
最新文章
- ActiveMQ(li)
- django ftp 研究
- ASP.NET操作ORACLE数据库之模糊查询
- Linux设备驱动之中断支持及中断分层
- A session had already been started - ignoring session_start() 解决方法
- [IT学习]一些有用的工具
- Chrome常用快捷键
- __ATTRIBUTE__ 你知多少?【转】
- Hadoop与HBase中遇到的问题
- 小程序大智慧,sqlserver 注释提取工具
- react重学
- 吴恩达机器学习笔记60-大规模机器学习(Large Scale Machine Learning)
- Django缓存设置
- 7.6 C++基本序列式容器效率比较
- DevExpress DateEdit控件选择精确到秒
- 卷积神经网络之GoogleNet:inceptionV3模型学习
- 第二章&#160;向量(d4)有序向量:二分查找(改进)
- IEEEXtreme Practice Community Xtreme9.0 - Digit Fun!
- Git工程迁移方法总结(命令行) .(转载)
- UVA10212 【The Last Non-zero Digit.】
热门文章
- RecyclerView 刷新后自动滚动的问题,notifyDataSetChanged 后自己滚动
- pyqt5实现注册界面并获得文本框内容
- 前端笔记之Vue(一)初识SPA和Vue&;webpack配置和vue安装&;指令
- 响应式WEB设计的基本原则大总结
- 自学java难吗?一个JAVA学习者应该具备的素质
- 新手篇丨Python任意网段Web端口信息探测工具
- 使用vue开发项目需要注意的问题和可能踩到的坑
- NumPy 超详细教程(1):NumPy 数组
- 《k8s-1.13版本源码分析》-抢占调度
- hashCode()方法以及集合中Set的一些总结