在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
水印制作就是简要来说利用GDI+的函数,进行原图和水印图片的合成,或者在原图上配置文字。 水印制作的关键函数:
这两个函数有比较多重载,具体请参考MSDN。 说到GDI+,他一般用于Winform对于GUI的绘制,例如桌面上的窗体。其实GDI不仅可以绘制窗体,它可以绘制一切的表面图像。 其中Graphics是绘制图像最核心的类,该对象就像一张画图画的画布,我们可以绘制图像的方法在其上绘图。一个应用程序如果需要绘制和着色,它就必须使用该对象。 此外不得不说还有两个对象:Image类和BitMap类。这两个对象也比较重要。 首先是Image类,该类提供了位图和元文件操作的函数,它是一个抽象类,不能实例化,只能用作基类,我们主要用它来加载一些文件,生成Image对象,以便对位图进一步操作。 其次是BitMap对象,用于由像素数据定义的图像,它也是进行图像处理的主要类。我们可以取得或者设置它的一些属性,还可用它读入和保存一些图像。 下面就进入我们的主题: 一、绘制文字水印
View Code
private static void drawText(Graphics g, String wmText, Font font, PointF p, StringFormat format)
{
SolidBrush brush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
g.DrawString(wmText, font, brush, p, format);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置g的呈现质量
//用指定的笔刷,和字体绘制文字
SolidBrush brush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));
g.DrawString(wmText, font, brush2, new PointF(p.X + 1, p.Y + 1), format);
}
二、绘制图片水印 图片水印主要是两个图像的合成,重点是要设置图片的水印的透明度,透明度一般降为原来的30%,这里将使用colorMatrix来做。矩阵在很多地方的被合使用,主要有矩阵进行像素的高速变换(其它方法处理速度相对较慢),特别是变换的地方。仔细观察矩阵对角线数字,1,1,1,0.3,1;这些是倍数运算因子,对应RGBAW的变换倍数。RGB不变,透明度为原来的0.3倍。通过这种方法就将图片的透明度降低了。 设置图像特性,主要是透明度的代码:
View Code
private static ImageAttributes getImageAttributes() { ImageAttributes imgAttr = new ImageAttributes(); ColorMap colorMap = new ColorMap(); colorMap.OldColor = Color.FromArgb(255, 0, 255, 0); colorMap.NewColor = Color.FromArgb(0, 0, 0, 0); ColorMap[] remapTable = { colorMap }; imgAttr.SetRemapTable(remapTable, ColorAdjustType.Bitmap); 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, (float)(ImageTransparencyNum/100.0), 0.0f}, new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f} }; ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements); imgAttr.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); return imgAttr; } 绘制图片水印核心的代码:
View Code
public static Bitmap AddWaterMark_IMG(String srcPath, String watermarkPath, WaterMarkPosition wp = WaterMarkPosition.BottomRight) { using (Image src = Image.FromFile(srcPath)) { using (Bitmap bm = new Bitmap(srcPath)) { using (Graphics g = Graphics.FromImage(bm)) { using (Image wm = Image.FromFile(watermarkPath)) { ImageAttributes imgAttr = getImageAttributes(); Rectangle rect = getPicRectangle(src, wm, wp); g.DrawImage(wm, rect, 0, 0, wm.Width, wm.Height, GraphicsUnit.Pixel, imgAttr); return new Bitmap((Image)(bm.Clone())); } } } } } 有时灰度化图像也比较常用,这个如果也用像素法处理也是较慢的,我们也采用矩阵处理
View Code
public static Bitmap GrayPicuure(String srcPicturePath) { using (Bitmap currentBitmap = new Bitmap(srcPicturePath)) { using (Graphics g = Graphics.FromImage(currentBitmap)) { using (ImageAttributes ia = new ImageAttributes()) { float[][] colorMatrix = { new float[] {0.299f, 0.299f, 0.299f, 0, 0}, new float[] {0.587f, 0.587f, 0.587f, 0, 0}, new float[] {0.114f, 0.114f, 0.114f, 0, 0}, new float[] {0, 0, 0, 1, 0}, new float[] {0, 0, 0, 0, 1} }; //颜色调整矩阵 ColorMatrix cm = new ColorMatrix(colorMatrix); ia.SetColorMatrix(cm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); g.DrawImage(currentBitmap, new Rectangle(0, 0, currentBitmap.Width, currentBitmap.Height), 0, 0, currentBitmap.Width, currentBitmap.Height, GraphicsUnit.Pixel, ia); return new Bitmap((Image)(currentBitmap.Clone())); } } } } 此外我们在图像处理时也会翻转旋转图像,这里主要用Image类的RotateFlip方法处理
View Code
public static Bitmap RotateFlipPicture(String srcPicturePath, RotateFlipType RotateFlipType) { using (Image tmp = Image.FromFile(srcPicturePath)) { tmp.RotateFlip(RotateFlipType); return new Bitmap(tmp); } } 图像处理内容比较多,在此不一列举,这里只给出常用的,下面给出全部源代码
View Code
1 /* 2 * Copyright 2012 www.vision.net.cn 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 using System; 18 using System.IO; 19 using System.Drawing; 20 using System.Drawing.Imaging; 21 using System.Windows.Forms; 22 23 namespace myDrawing 24 { 25 /// <summary> 26 /// 水印的位置 27 /// </summary> 28 public enum WaterMarkPosition 29 { 30 /// <summary> 31 /// 左上角 32 /// </summary> 33 TopLeft, 34 /// <summary> 35 /// 左下角 36 /// </summary> 37 BottomLeft, 38 /// <summary> 39 /// 右上角 40 /// </summary> 41 TopRight, 42 /// <summary> 43 /// 右下角 44 /// </summary> 45 BottomRight, 46 /// <summary> 47 /// 顶部中间 48 /// </summary> 49 TopCenter, 50 /// <summary> 51 /// 底部中间 52 /// </summary> 53 BottomCenter 54 }; 55 /// <summary> 56 /// 字体 57 /// </summary> 58 public enum myFont 59 { 60 /// <summary> 61 /// 字体:中文宋体 62 /// </summary> 63 宋体, 64 /// <summary> 65 /// 字体:中文楷体 66 /// </summary> 67 楷体, 68 /// <summary> 69 /// 字体:中文仿宋 70 /// </summary> 71 仿宋, 72 /// <summary> 73 /// 字体:中文黑体 74 /// </summary> 75 黑体, 76 /// <summary> 77 /// 字体:Arial 78 /// </summary> 79 Arial, 80 /// <summary> 81 /// 字体:Georgia 82 /// </summary> 83 Georgia 84 } 85 /// <summary> 86 /// 水印工具 87 /// </summary> 88 public class Watermark 89 { 90 private static int imageTransparency=0; 91 /// <summary> 92 /// 水印图像的透明度,默认30%透明 93 /// </summary> 94 public static int ImageTransparencyNum 95 { 96 get { if (imageTransparency == 0)imageTransparency = 30; return imageTransparency; } 97 set 98 { 99 if (imageTransparency >=0 && imageTransparency <= 100) imageTransparency = value; 100 } 101 } 102 /// <summary> 103 /// 取得设置的图像特性,主要是透明度 104 /// </summary> 105 /// <returns></returns> 106 private static ImageAttributes getImageAttributes() 107 { 108 ImageAttributes imgAttr = new ImageAttributes(); 109 110 ColorMap colorMap = new ColorMap(); 111 colorMap.OldColor = Color.FromArgb(255, 0, 255, 0); 112 colorMap.NewColor = Color.FromArgb(0, 0, 0, 0); 113 ColorMap[] remapTable = { colorMap }; 114 115 imgAttr.SetRemapTable(remapTable, ColorAdjustType.Bitmap); 116 117 float[][] colorMatrixElements = { 118 new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f}, 119 new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f}, 120 new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f}, 121 new float[] {0.0f, 0.0f, 0.0f, (float)(ImageTransparencyNum/100.0), 0.0f}, 122 new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f} 123 }; 124 125 ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements); 126 imgAttr.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 127 128 return imgAttr; 129 } 130 /// <summary> 131 /// 添加图片水印:将原始图片添加图片水印之后存储 132 /// </summary> 133 /// <param name="srcPath">原图片绝对地址</param> 134 /// <param name="watermarkPath">水印图片路径</param> 135 /// <param name="wp">水印位置的枚举值</param> 136 public static Bitmap AddWaterMark_IMG(String srcPath, String watermarkPath, WaterMarkPosition wp = WaterMarkPosition.BottomRight) 137 { 138 using (Image src = Image.FromFile(srcPath)) 139 { 140 using (Bitmap bm = new Bitmap(srcPath)) 141 { 142 using (Graphics g = Graphics.FromImage(bm)) 143 { 144 using (Image wm = Image.FromFile(watermarkPath)) 145 { 146 147 ImageAttributes imgAttr = getImageAttributes(); 148 Rectangle rect = getPicRectangle(src, wm, wp); 149 150 g.DrawImage(wm, rect, 0, 0, wm.Width, wm.Height, GraphicsUnit.Pixel, imgAttr); 151 152 return new Bitmap((Image)(bm.Clone())); 153 154 } 155 } 156 } 157 } 158 159 } 160 161 /// <summary> 162 /// 取得绘制水印的矩形 163 /// </summary> 164 /// <param name="src">原图像映像</param> 165 /// <param name="wm">水印图像映像</param> 166 /// <param name="wp">指定的水印位置枚举值WaterMarkPosition</param> 167 /// <returns></returns> 168 private static Rectangle getPicRectangle(Image src, Image wm, WaterMarkPosition wp) 169 { 170 171 int xpos = 10;//水印图像X坐标 172 int ypos = 10;//水印图像y坐标 173 174 switch (wp) 175 { 176 case WaterMarkPosition.TopLeft: 177 xpos = 10; 178 ypos = 10; 179 break; 180 case WaterMarkPosition.TopCenter: 181 xpos = src.Width / 2 - wm.Width / 2; 182 ypos = 10; 183 break; 184 case WaterMarkPosition.TopRight: 185 xpos = ((src.Width - wm.Width) - 10); 186 ypos = 10; 187 break; 188 case WaterMarkPosition.BottomLeft: 189 xpos = 10; 190 ypos = src.Height - wm.Height - 10; 191 break; 192 case WaterMarkPosition.BottomRight: 193 xpos = ((src.Width - wm.Width) - 10); 194 ypos = src.Height - wm.Height - 10; 195 break; 196 case WaterMarkPosition.BottomCenter: 197 xpos = src.Width / 2 - wm.Width / 2; 198 ypos = src.Height - wm.Height - 10; 199 break; 200 } 201 return new Rectangle(xpos, ypos, wm.Width, wm.Height); 202 } 203 204 /// <summary> 205 /// 添加文字水印:将原始图片添加文字水印之后存储 206 /// </summary> 207 /// <param name="srcPath">原图片绝对地址</param> 208 /// <param name="words">要添加的水印文本</param> 209 /// <param name="wp">水印位置WaterMarkPosition,参数可数</param> 210 /// <param name="fontSize">字体大小,可选</param> 211 /// <param name="myfont">字体myFont,可选</param> 212 public static Bitmap AddWaterMark_WORD(String srcPath, String words, WaterMarkPosition wp = WaterMarkPosition.BottomRight, int fontSize = 40, myFont myfont = myFont.楷体) 213 { 214 215 using (Image src = Image.FromFile(srcPath)) 216 { 217 using (Bitmap bm = new Bitmap(srcPath)) 218 { 219 using (Graphics g = Graphics.FromImage(bm)) 220 { 221 //font定义特定的文字格式,包括文本字体,字号大小,和字形属性。 222 Font crFont = new Font(myfont.ToString(), fontSize, FontStyle.Regular); 223 //Sizef存储有序的浮点数对。通常为矩形的宽度和高度。(Drawing.SizeF) 224 SizeF crSize = g.MeasureString(words, crFont); 225 //FontAndSize fs = FontAndSize.GetValue(g, words, "arial", fontSize, src.Width); 226 PointF p = getTextPoint(src, crSize, wp); 227 StringFormat sf = getStringFormat(); 228 229 drawText(g, words, crFont, p, sf); 230 231 return new Bitmap((Image)(bm.Clone())); 232 } 233 } 234 } 235 236 } 237 /// <summary> 238 /// 绘制文本对象 239 /// </summary> 240 /// <param name="g">Graphics画面 对象</param> 241 /// <param name="wmText">水印文字的内容</param> 242 /// <param name="font">水印文字的字体</param> 243 /// <param name="p">水印文字的位置坐标有序对</param> 244 /// <param name="format">水印广本的格式化格式</param> 245 private static void drawText(Graphics g, String wmText, Font font, PointF p, StringFormat format) 246 { 247 248 SolidBrush brush = new SolidBrush(Color.FromArgb(153, 255, 255, 255)); 249 g.DrawString(wmText, font, brush, p, format); 250 251 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置g的呈现质量 252 //用指定的笔刷,和字体绘制文字 253 SolidBrush brush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0)); 254 g.DrawString(wmText, font, brush2, new PointF(p.X + 1, p.Y + 1), format); 255 256 } 257 /// <summary> 258 /// 取得水印的格式格式 259 /// </summary> 260 /// <returns>StringFormat格式</returns> 261 private static StringFormat getStringFormat() 262 { 263 StringFormat StrFormat = new StringFormat(); 264 StrFormat.Alignment = StringAlignment.Center; 265 return StrFormat; 266 } 全部评论
专题导读
热门推荐
热门话题
阅读排行榜
|
请发表评论