1、C#图片加文字图片水印using System; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; using System.IO; / / 图片位置 / public enum ImagePosition LeftTop, /左上 LeftBottom, /左下 RightTop, /右上 RigthBottom, /右下 TopMiddle, /顶部居中 BottomMiddle, /底部居中 Center /中心 / / 水印图片的操作管理 Design by Gary
2、Gong From D / public class WaterImageManage / / 生成一个新的水印图片制作实例 / public WaterImageManage () / / TODO: Add constructor logic here / / / 添加图片水印 / / 源图片文件名 / 水印图片文件名 / 透明度(0.1-1.0数值越小透明度越高) / 位置 / 图片的路径 / 返回生成于指定文件夹下的水印文件名 public string DrawImage(string sourcePicture, string waterImage, float alpha, Im
3、agePosition position, string PicturePath ) / / 判断参数是否有效 / if (sourcePicture = string.Empty | waterImage = string.Empty | alpha = 0.0 | PicturePath = string.Empty) return sourcePicture; / / 源图片,水印图片全路径 / string sourcePictureName = PicturePath + sourcePicture; string waterPictureName = PicturePath + w
4、aterImage; string fileSourceExtension = System.IO.Path.GetExtension(sourcePictureName).ToLower(); string fileWaterExtension = System.IO.Path.GetExtension(waterPictureName).ToLower(); / / 判断文件是否存在,以及类型是否正确 / if (System.IO.File.Exists(sourcePictureName) = false | System.IO.File.Exists(waterPictureName
5、) = false |( fileSourceExtension != .gif & fileSourceExtension != .jpg & fileSourceExtension != .png) | ( fileWaterExtension != .gif & fileWaterExtension != .jpg & fileWaterExtension != .png) ) return sourcePicture; / / 目标图片名称及全路径 / string targetImage = sourcePictureName.Replace ( System.IO.Path.Get
6、Extension(sourcePictureName),) + _1101.jpg; / / 将需要加上水印的图片装载到Image对象中 / Image imgPhoto = Image.FromFile(sourcePictureName); / / 确定其长宽 / int phWidth = imgPhoto.Width; int phHeight = imgPhoto.Height; / / 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。 / Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Forma
7、t24bppRgb); / / 设定分辨率 / bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); / / 定义一个绘图画面用来装载位图 / Graphics grPhoto = Graphics.FromImage(bmPhoto); / /同样,由于水印是图片,我们也需要定义一个Image来装载它 / Image imgWatermark = new Bitmap(waterPictureName); / / 获取水印图片的高度和宽度 / int wmWidth = imgWa
8、termark.Width; int wmHeight = imgWatermark.Height; /SmoothingMode:指定是否将平滑处理(消除锯齿)应用于直线、曲线和已填充区域的边缘。 / 成员名称 说明 / AntiAlias 指定消除锯齿的呈现。 / Default 指定不消除锯齿。 / HighQuality 指定高质量、低速度呈现。 / HighSpeed 指定高速度、低质量呈现。 / Invalid 指定一个无效模式。 / None 指定不消除锯齿。 grPhoto.SmoothingMode = SmoothingMode.AntiAlias; / / 第一次描绘,将
9、我们的底图描绘在绘图画面上 / grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel); / / 与底图一样,我们需要一个位图来装载水印图片。并设定其分辨率 / Bitmap bmWatermark = new Bitmap(bmPhoto); bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); / / 继
10、续,将水印图片装载到一个绘图画面grWatermark / Graphics grWatermark = Graphics.FromImage(bmWatermark); / /ImageAttributes 对象包含有关在呈现时如何操作位图和图元文件颜色的信息。 / ImageAttributes imageAttributes = new ImageAttributes(); / /Colormap: 定义转换颜色的映射 / ColorMap colorMap = new ColorMap(); / /我的水印图被定义成拥有绿色背景色的图片被替换成透明 / colorMap.OldColo
11、r = Color.FromArgb(255, 0, 255, 0); colorMap.NewColor = Color.FromArgb(0, 0, 0, 0); ColorMap remapTable = colorMap ; imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap); float colorMatrixElements = new float 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, / red红色 new float 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
12、/green绿色 new float 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, /blue蓝色 new float 0.0f, 0.0f, 0.0f, alpha, 0.0f, /透明度 new float 0.0f, 0.0f, 0.0f, 0.0f, 1.0f;/ / ColorMatrix:定义包含 RGBA 空间坐标的 5 x 5 矩阵。 / ImageAttributes 类的若干方法通过使用颜色矩阵调整图像颜色。 ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements); imageAttri
13、butes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); / /上面设置完颜色,下面开始设置位置 / int xPosOfWm; int yPosOfWm; switch (position) case ImagePosition .BottomMiddle : xPosOfWm = (phWidth-wmWidth ) / 2 ; yPosOfWm = phHeight- wmHeight -10; break ; case ImagePosition .Center : xPo
14、sOfWm = (phWidth - wmWidth) / 2; yPosOfWm = (phHeight-wmHeight ) / 2; break ; case ImagePosition .LeftBottom : xPosOfWm = 10; yPosOfWm = phHeight - wmHeight - 10; break ; case ImagePosition .LeftTop : xPosOfWm = 10; yPosOfWm = 10; break; case ImagePosition .RightTop : xPosOfWm = phWidth - wmWidth -
15、10; yPosOfWm = 10; break ; case ImagePosition .RigthBottom : xPosOfWm = phWidth - wmWidth - 10; yPosOfWm = phHeight - wmHeight - 10; break ; case ImagePosition.TopMiddle : xPosOfWm = (phWidth - wmWidth) / 2; yPosOfWm = 10; break ; default: xPosOfWm = 10; yPosOfWm = phHeight - wmHeight - 10; break; /
16、 / 第二次绘图,把水印印上去 / grWatermark.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes); imgPhoto = bmWatermark; grPhoto.Dispose(); grWatermark.Dispose(); / / 保存文件到服务器的文件夹里面 / imgPhoto.Save(targetImage, ImageFormat.Jpe
17、g); imgPhoto.Dispose(); imgWatermark.Dispose(); return targetImage.Replace (PicturePath,); / / 在图片上添加水印文字 / / 源图片文件 / 需要添加到图片上的文字 / 透明度 / 位置 / 文件路径 / public string DrawWords(string sourcePicture, string waterWords, float alpha, ImagePosition position, string PicturePath) / / 判断参数是否有效 / if (sourcePic
18、ture = string.Empty | waterWords = string.Empty | alpha = 0.0 | PicturePath = string.Empty) return sourcePicture; / / 源图片全路径 / string sourcePictureName = PicturePath + sourcePicture; string fileExtension = System.IO.Path.GetExtension(sourcePictureName).ToLower(); / / 判断文件是否存在,以及文件名是否正确 / if (System.
19、IO.File.Exists(sourcePictureName) = false | ( fileExtension != .gif & fileExtension != .jpg & fileExtension != .png ) return sourcePicture; / / 目标图片名称及全路径 / string targetImage = sourcePictureName.Replace(System.IO.Path.GetExtension(sourcePictureName), ) + _0703.jpg; /创建一个图片对象用来装载要被添加水印的图片 Image imgP
20、hoto = Image.FromFile(sourcePictureName); /获取图片的宽和高 int phWidth = imgPhoto.Width; int phHeight = imgPhoto.Height; / /建立一个bitmap,和我们需要加水印的图片一样大小 Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb); /SetResolution:设置此 Bitmap 的分辨率 /这里直接将我们需要添加水印的图片的分辨率赋给了bitmap bmPhoto.SetResolut
21、ion(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); /Graphics:封装一个 GDI+ 绘图图面。 Graphics grPhoto = Graphics.FromImage(bmPhoto); /设置图形的品质 grPhoto.SmoothingMode = SmoothingMode.AntiAlias; /将我们要添加水印的图片按照原始大小描绘(复制)到图形中 grPhoto.DrawImage( imgPhoto, / 要添加水印的图片 new Rectangle(0, 0, phWidth, phHei
22、ght), / 根据要添加的水印图片的宽和高 0, / X方向从0点开始描绘 0, / Y方向 phWidth, / X方向描绘长度 phHeight, / Y方向描绘长度 GraphicsUnit.Pixel); / 描绘的单位,这里用的是像素 /根据图片的大小我们来确定添加上去的文字的大小 /在这里我们定义一个数组来确定 int sizes = new int 16, 14, 12, 10, 8, 6, 4 ; /字体 Font crFont = null; /矩形的宽度和高度,SizeF有三个属性,分别为Height高,width宽,IsEmpty是否为空 SizeF crSize =
23、new SizeF(); /利用一个循环语句来选择我们要添加文字的型号 /直到它的长度比图片的宽度小 for (int i = 0; i 7; i+) crFont = new Font(arial, sizesi, FontStyle.Bold); /测量用指定的 Font 对象绘制并用指定的 StringFormat 对象格式化的指定字符串。 crSize = grPhoto.MeasureString(waterWords, crFont); / ushort 关键字表示一种整数数据类型 if (ushort)crSize.Width (ushort)phWidth) break; /截
24、边5%的距离,定义文字显示(由于不同的图片显示的高和宽不同,所以按百分比截取) int yPixlesFromBottom = (int)(phHeight * .05); /定义在图片上文字的位置 float wmHeight = crSize.Height; float wmWidth = crSize .Width ; float xPosOfWm; float yPosOfWm; switch (position) case ImagePosition .BottomMiddle : xPosOfWm = phWidth / 2 ; yPosOfWm = phHeight- wmHei
25、ght -10; break ; case ImagePosition .Center : xPosOfWm = phWidth / 2; yPosOfWm = phHeight / 2; break ; case ImagePosition .LeftBottom : xPosOfWm = wmWidth; yPosOfWm = phHeight - wmHeight - 10; break ; case ImagePosition .LeftTop : xPosOfWm = wmWidth/2 ; yPosOfWm = wmHeight / 2; break; case ImagePosi
26、tion .RightTop : xPosOfWm = phWidth - wmWidth - 10; yPosOfWm = wmHeight; break ; case ImagePosition .RigthBottom : xPosOfWm = phWidth - wmWidth - 10; yPosOfWm = phHeight - wmHeight - 10; break ; case ImagePosition.TopMiddle : xPosOfWm = phWidth / 2; yPosOfWm = wmWidth; break ; default: xPosOfWm = wmWidth; yPosOfWm = phHeight - wmHeight - 10; break; /封装文本布局信息(如对齐、文字方向和 Tab 停靠位),显示操作(如省略号插入和国家标准 (National) 数字替换)和 OpenType 功能。 StringFormat StrFormat = new StringFormat(); /定义需要印的文
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1