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( 255 , 0 , 255 , 0 );
26 colorMap.NewColor = Color.FromArgb( 0 , 0 , 0 , 0 );
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.0f , 0.0f , 0.0f , 0.0f , 0.0f },
38 new float [] { 0.0f , 1.0f , 0.0f , 0.0f , 0.0f },
39 new float [] { 0.0f , 0.0f , 1.0f , 0.0f , 0.0f },
40 new float [] { 0.0f , 0.0f , 0.0f , transparency, 0.0f },
41 new float [] { 0.0f , 0.0f , 0.0f , 0.0f , 1.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), 0 , 0 , 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 else
113 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 else
204 img.Save(filename);
205
206 g.Dispose();
207 img.Dispose();
208 }
209

有什么不足之处,请园友们尽情拍砖!!

你可能感兴趣的:(C#)