C#图片水印代码整理
这一段公司有个项目,客户要求上传的图片要带上自定义的水印。以前也经常和朋友讨论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#图片水印代码整理的更多相关文章
- 在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)
安装过程(如图所示) .Exceptionin thread "main" java.lang.UnsatisfiedLinkError:C:\WINDOWS\system32\j ...
- php使用GD库实现图片水印和缩略图——封装成类
学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...
- php文字水印和php图片水印实现代码
本文章向码农们介绍php文字水印和php图片水印实现代码,需要的码农可以参考一下. php 文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件. 实现 ...
- PHP加水印代码 支持文字和图片水印
PHP加图片水印.文字水印类代码,PHP加水印类,支持文字图片水印的透明度设置.水印图片背景透明.自己写的一个类,因为自己开发的一套CMS中要用到,网上的总感觉用着不顺手,希望大家也喜欢这个类,后附有 ...
- php文字水印和php图片水印实现代码(二种加水印方法)
文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件.效果图如下: $dst_path = 'dst.jpg';//创建图片的实例$dst = imag ...
- 利用canvas添加图片水印--直接上代码
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- php图片水印添加,压缩,剪切的封装类
php对图片文件的操作主要是利用GD库扩展.当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码.当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有 ...
- webform:图片水印、验证码制作
一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat=& ...
- webform(十)——图片水印和图片验证码
两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID=&q ...
随机推荐
- jquery系列教程7-自定义jquery插件全解:对象函数、全局函数、选择器
点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...
- 【原创】自用css reset
自己工作中常用的reset,和一些设置,实际用时会根据网站页面进行增删. /* Common style */html{ overflow-y:scroll; overflow-x:auto;}bod ...
- SAP问题【转载】
1.A:在公司代码分配折旧表时报错? 在公司代码分配折旧表时报错,提示是"3000 的公司代码分录不完全-参见长文本" 希望各位大侠帮我看看. 3000 的公司代码分录不完全-参见 ...
- caffe源码 池化层 反向传播
图示池化层(前向传播) 池化层其实和卷积层有点相似,有个类似卷积核的窗口按照固定的步长在移动,每个窗口做一定的操作,按照这个操作的类型可以分为两种池化层: 输入参数如下: 输入: 1 * 3 * 4 ...
- Android Annotations Eclipse 配置 (3)
Android Annotations 本来我想写个 Java 版本的<RESTful客户端库:RestClient>用于 Android 应用开发,结果发现不太好写,虽然用了 Dynam ...
- Java 内存模型- Java Memory Model
多线程越来越多的使用,使得我们需要对它的深入理解.那么就涉及到了Java内存模型JMM.JMM是JVM的一部分,JMM定义了一个线程修改了一个共享变量,其他线程什么时候或者如何看到这个变量,如何去访问 ...
- 深入浅出 SpringMVC - 2 提升篇
前言: 本篇笔记是继 深入浅出 SpringMVC - 1 后的续篇,主要介绍了 SpringMVC 的实际小应用,包括 SpringMVC 的数据格式化.使用 JSR 303 验证标准 在 Spri ...
- 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块
HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...
- Python基础3切片,字符串的方法
切片:截取字符串某一段字符,并不改变原字符串.结构:[起始位置:终止位置:步长] 但不包括终止位置.所谓:顾头不顾尾 索引:序列中每个元素都是有编号的,都是从0开始编号的.使用负数索引时,Pytho ...
- 【转】循环冗余校验(CRC)算法入门引导
原文地址:循环冗余校验(CRC)算法入门引导 参考地址:https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks#Re ...