这一段公司有个项目,客户要求上传的图片要带上自定义的水印。以前也经常和朋友讨论C#图片水印方面的问题,但是从来没有实际操作过。所以,借这次项目的机会也研究了一下C#图片水印的功能!本人参考的是discuz论坛中的代码。这种方法是直接把要上传的图片先转化成System.Drawing.Image,而不用保存到服务器端的磁盘上,然后加上水印重新绘制,再保存到服务器端的磁盘上,下面就拿出来晒晒:

  1/// <summary>  2 /// 加图片水印  3 /// </summary>  4 /// <param name="img">要加水印的原图(System.Drawing)</param>  5 /// <param name="filename">文件名</param>  6 /// <param name="watermarkFilename">水印文件名</param>  7 /// <param name="watermarkStatus">图片水印位置1=左上 2=中上 3=右上 4=左中  5=中中 6=右中 7=左下 8=右中 9=右下</param>  8 /// <param name="quality">加水印后的质量0~100,数字越大质量越高</param>  9 /// <param name="watermarkTransparency">水印图片的透明度1~10,数字越小越透明,10为不透明</param> 10  public static void ImageWaterMarkPic(Image img, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency) 11         { 12             Graphics g = Graphics.FromImage(img); 13 //设置高质量插值法 14 //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; 15 //设置高质量,低速度呈现平滑程度 16 //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 17             Image watermark = new Bitmap(watermarkFilename); 18  19 if (watermark.Height >= img.Height || watermark.Width >= img.Width) 20 return; 21  22             ImageAttributes imageAttributes = new ImageAttributes(); 23             ColorMap colorMap = new ColorMap(); 24  25             colorMap.OldColor = Color.FromArgb(25502550); 26             colorMap.NewColor = Color.FromArgb(0000); 27             ColorMap[] remapTable = { colorMap }; 28  29             imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap); 30  31 float transparency = 0.5F; 32 if (watermarkTransparency >= 1 && watermarkTransparency <= 10) 33                 transparency = (watermarkTransparency / 10.0F); 34  35  36 float[][] colorMatrixElements = { 37 new float[] {1.0f0.0f0.0f0.0f0.0f}, 38 new float[] {0.0f1.0f0.0f0.0f0.0f}, 39 new float[] {0.0f0.0f1.0f0.0f0.0f}, 40 new float[] {0.0f0.0f0.0f,  transparency, 0.0f}, 41 new float[] {0.0f0.0f0.0f0.0f1.0f} 42                                             }; 43  44             ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements); 45  46             imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 47  48 int xpos = 0; 49 int ypos = 0; 50  51 switch (watermarkStatus) 52             { 53 case 1: 54                     xpos = (int)(img.Width * (float).01); 55                     ypos = (int)(img.Height * (float).01); 56 break; 57 case 2: 58                     xpos = (int)((img.Width * (float).50- (watermark.Width / 2)); 59                     ypos = (int)(img.Height * (float).01); 60 break; 61 case 3: 62                     xpos = (int)((img.Width * (float).99- (watermark.Width)); 63                     ypos = (int)(img.Height * (float).01); 64 break; 65 case 4: 66                     xpos = (int)(img.Width * (float).01); 67                     ypos = (int)((img.Height * (float).50- (watermark.Height / 2)); 68 break; 69 case 5: 70                     xpos = (int)((img.Width * (float).50- (watermark.Width / 2)); 71                     ypos = (int)((img.Height * (float).50- (watermark.Height / 2)); 72 break; 73 case 6: 74                     xpos = (int)((img.Width * (float).99- (watermark.Width)); 75                     ypos = (int)((img.Height * (float).50- (watermark.Height / 2)); 76 break; 77 case 7: 78                     xpos = (int)(img.Width * (float).01); 79                     ypos = (int)((img.Height * (float).99- watermark.Height); 80 break; 81 case 8: 82                     xpos = (int)((img.Width * (float).50- (watermark.Width / 2)); 83                     ypos = (int)((img.Height * (float).99- watermark.Height); 84 break; 85 case 9: 86                     xpos = (int)((img.Width * (float).99- (watermark.Width)); 87                     ypos = (int)((img.Height * (float).99- watermark.Height); 88 break; 89             } 90  91             g.DrawImage(watermark, new Rectangle(xpos, ypos, watermark.Width, watermark.Height), 00, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes); 92  93             ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 94             ImageCodecInfo ici = null; 95 foreach (ImageCodecInfo codec in codecs) 96             { 97 if (codec.MimeType.IndexOf("jpeg"> -1) 98                     ici = codec; 99             }100             EncoderParameters encoderParams = new EncoderParameters();101 long[] qualityParam = new long[1];102 if (quality < 0 || quality > 100)103                 quality = 80;104 105             qualityParam[0= quality;106 107             EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);108             encoderParams.Param[0= encoderParam;109 110 if (ici != null)111                 img.Save(filename, ici, encoderParams);112 else113                 img.Save(filename);114 115             g.Dispose();116             img.Dispose();117             watermark.Dispose();118             imageAttributes.Dispose();119         }120 121 /// <summary>122 /// 增加图片文字水印123 /// </summary>124 /// <param name="img">要加水印的原图(System.Drawing)</param>125 /// <param name="filename">文件名</param>126 /// <param name="watermarkText">水印文字</param>127 /// <param name="watermarkStatus">图片水印位置1=左上 2=中上 3=右上 4=左中  5=中中 6=右中 7=左下 8=右中 9=右下</param>128 /// <param name="quality">加水印后的质量0~100,数字越大质量越高</param>129 /// <param name="fontname">水印的字体</param>130 /// <param name="fontsize">水印的字号</param>131 public static void ImageWaterMarkText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)132         {133             Graphics g = Graphics.FromImage(img);134             Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);135             SizeF crSize;136             crSize = g.MeasureString(watermarkText, drawFont);137 138 float xpos = 0;139 float ypos = 0;140 141 switch (watermarkStatus)142             {143 case 1:144                     xpos = (float)img.Width * (float).01;145                     ypos = (float)img.Height * (float).01;146 break;147 case 2:148                     xpos = ((float)img.Width * (float).50- (crSize.Width / 2);149                     ypos = (float)img.Height * (float).01;150 break;151 case 3:152                     xpos = ((float)img.Width * (float).99- crSize.Width;153                     ypos = (float)img.Height * (float).01;154 break;155 case 4:156                     xpos = (float)img.Width * (float).01;157                     ypos = ((float)img.Height * (float).50- (crSize.Height / 2);158 break;159 case 5:160                     xpos = ((float)img.Width * (float).50- (crSize.Width / 2);161                     ypos = ((float)img.Height * (float).50- (crSize.Height / 2);162 break;163 case 6:164                     xpos = ((float)img.Width * (float).99- crSize.Width;165                     ypos = ((float)img.Height * (float).50- (crSize.Height / 2);166 break;167 case 7:168                     xpos = (float)img.Width * (float).01;169                     ypos = ((float)img.Height * (float).99- crSize.Height;170 break;171 case 8:172                     xpos = ((float)img.Width * (float).50- (crSize.Width / 2);173                     ypos = ((float)img.Height * (float).99- crSize.Height;174 break;175 case 9:176                     xpos = ((float)img.Width * (float).99- crSize.Width;177                     ypos = ((float)img.Height * (float).99- crSize.Height;178 break;179             }180 181 //g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1);文字阴影182             g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);183 184             ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();185             ImageCodecInfo ici = null;186 foreach (ImageCodecInfo codec in codecs)187             {188 if (codec.MimeType.IndexOf("jpeg"> -1)189                     ici = codec;190             }191             EncoderParameters encoderParams = new EncoderParameters();192 long[] qualityParam = new long[1];193 if (quality < 0 || quality > 100)194                 quality = 80;195 196             qualityParam[0= quality;197 198             EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);199             encoderParams.Param[0= encoderParam;200 201 if (ici != null)202                 img.Save(filename, ici, encoderParams);203 else204                 img.Save(filename);205 206             g.Dispose();207             img.Dispose();208         }209

C#图片水印代码整理的更多相关文章

  1. 在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)

    安装过程(如图所示) .Exceptionin thread "main" java.lang.UnsatisfiedLinkError:C:\WINDOWS\system32\j ...

  2. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  3. php文字水印和php图片水印实现代码

    本文章向码农们介绍php文字水印和php图片水印实现代码,需要的码农可以参考一下. php 文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件. 实现 ...

  4. PHP加水印代码 支持文字和图片水印

    PHP加图片水印.文字水印类代码,PHP加水印类,支持文字图片水印的透明度设置.水印图片背景透明.自己写的一个类,因为自己开发的一套CMS中要用到,网上的总感觉用着不顺手,希望大家也喜欢这个类,后附有 ...

  5. php文字水印和php图片水印实现代码(二种加水印方法)

    文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件.效果图如下: $dst_path = 'dst.jpg';//创建图片的实例$dst = imag ...

  6. 利用canvas添加图片水印--直接上代码

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. php图片水印添加,压缩,剪切的封装类

    php对图片文件的操作主要是利用GD库扩展.当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码.当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有 ...

  8. webform:图片水印、验证码制作

    一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat=& ...

  9. webform(十)——图片水印和图片验证码

    两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID=&q ...

随机推荐

  1. 访问 IIS 元数据库失败

    问题: 访问 IIS 元数据库失败.说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Web ...

  2. Yii 2.0 数据库操作总结

    1. 概述 操作数据库有2种方式: DAO(data access object),不安全 ORM(onject relational mapping) 2. DAO Yii::app()->d ...

  3. zabbix基本操作

    zabbix基本操作 ---- 2016年终总结 二 包括的内容: 添加主机 查看监控数据 添加监控项 创建触发器 创建模版 添加报警 添加媒介 添加主机 进入页面 点击Configuration(大 ...

  4. Kvm虚拟化的一种打包及部署方案(采用tar包,lvm方式)

    Kvm虚拟化的一种打包部署方案(采用tar包,lvm方式) –-–-–-2016年终总结 一 毕业之后跟师兄学到的第一块主要内容,理解花了不少时间.期间经历了shell的入门.linux基础知识入门. ...

  5. Cygwin-添加到右键菜单脚本--一键安装、卸载

    平时习惯用一些linux命令来完成工作,在Windows上有cygwin和gitbash两个选择.这两个我都装了. 相对来说cygwin支持的功能更多一些,但是它没有默认绑定到右键菜单.为此,我想到用 ...

  6. SAP资产折旧,消息编号AA687:在上一年结算之后您只能记帐到新的一年

    问题:公司****在2015年底没有固定资产,忽略了月结的必要步骤,在2016年1-5月份一直没有计提折旧,再进行折旧时提示"在上一年结算之后您只能记帐到新的一年" 原因: sap ...

  7. Object类—复写equals方法,hashCode方法,toString方法

    Object:所有类的根类. Object是不断抽取而来,具备着所有对象都具备的共性内容. class Person extends Object { private int age; Person( ...

  8. table插件

    //动态添加一行function addRow(){ var firstrow=document.getElementById('firstrow'); var firstCopy=firstrow. ...

  9. Java 递归调用 recursive 给一个参数 返回一大堆

    需求: 需要组装成对象多层嵌套式的 json字符串; 想到使用 递归来完成这个多层嵌套: 憋了四个小时,终于写出来了; 先看效果: 数据库中的数据: 拼装后的效果: [ EmpVO{ ename='孙 ...

  10. java的windows自动化-自动运行java程序

    那么在一些工具齐全并且已经有了一定的写好的java程序的情况下(环境变量和软件见上一章http://www.cnblogs.com/xuezhezlr/p/7718273.html),如何自动化运行j ...