.net asp.net 图片添加水印 文字水印 图片图透明水印 按百分比设置图片水印 生成透明图片
本人新手,刚入职几个月很菜想结交些业内人进行交流学习,希望各位前辈们多多指点。前几天公司要我写个水印,要求比较活 文字水印要求:自己编辑文字,编辑字体大小,可以自己设置水印x、y坐标,颜色,透明百分比,文字显示方式(文字横排显示或竖排显示)。图片水印要求:图片水印x、y坐标,图片透明百分比等。
我从网上找了很多都不全,然后自己去查文档终于写出来了,虽然并不是太好,但想分享下给大家。
文字水印
#region 添加文字水印 /// <summary> /// 添加文字水印 /// </summary> /// <param name="originalPath">图片原路径</param> /// <param name="targetPath">图片目标路径</param> /// <param name="text">图片文字</param> /// <param name="x">x坐标</param> /// <param name="y">y坐标</param> /// <param name="textSize">文字大小</param> /// <param name="Transparent">水印图片透明百分比</param> /// <param name="r">文字颜色r</param> /// <param name="g">文字颜色g</param> /// <param name="b">文字颜色b</param> /// <param name="isAnyway">文字是否横屏显示</param> public void WatermarkText(string originalPath, string targetPath, string text, int x, int y, int textSize, int Transparent, int r, int g, int b, bool isAnyway=false) { try { System.Drawing.Image image = image = System.Drawing.Image.FromFile(originalPath); Graphics graphics = Graphics.FromImage(image); graphics.DrawImage(image, 0, 0, image.Width, image.Height); Font f = new Font("Verdana", textSize, FontStyle.Bold);//字体样式 //计算文字高度和宽度 //Size sz = TextRenderer.MeasureText(text, f); //int textHeight = sz.Height; //高 //int textWidth = sz.Width; //宽 //int height = y + textHeight; //int width = x + textWidth; if (image.Height < y) throw new Exception("水印高度超出图片高度!"); if (image.Width < x) throw new Exception("水印宽度超出图片宽度!"); int tran = (int)(255 - (Transparent * 2.55)); Brush brush = new SolidBrush(Color.FromArgb(tran, r, g, b)); StringFormat drawFormat = new StringFormat { FormatFlags = StringFormatFlags.DirectionVertical }; //drawFormat.FormatFlags = StringFormatFlags.DirectionVertical; if (isAnyway) graphics.DrawString(text, f, brush, x, y, drawFormat); else graphics.DrawString(text, f, brush, x, y); f.Dispose(); brush.Dispose(); drawFormat.Dispose(); graphics.Dispose(); //保存加水印过后的图片,删除原始图片 image.Save(targetPath); image.Dispose(); } catch (Exception ex) { throw ex; } } #endregion
上面代码我添加了个计算文字高度和宽的方法,后来没用。文字颜色我是取的rgb值 三个值是分别传过来的 。前面设置没花多长时间,就是文字显示方式花了我很长时间,去网上找了很久都没找到 最后查文档 终于被我找到。
图片水印:
#region 添加图片水印透明度 /// <summary> /// 添加图片水印 /// </summary> /// <param name="originalPath">图片原图路径</param> /// <param name="watermarkPath">水印图片</param> /// <param name="targetPath">目标路径</param> /// <param name="transparentImage">生成透明水印图片保存路径</param> /// <param name="x">水印位置x坐标</param> /// <param name="y">水印位置y坐标</param> /// <param name="transparent">水印图片透明百分比</param> public void WatermarkImagesTransparent(string originalPath, string watermarkPath, string targetPath, string transparentImage, int x, int y, int transparent) { try { System.Drawing.Image image = image = System.Drawing.Image.FromFile(originalPath); System.Drawing.Image copyImage = System.Drawing.Image.FromFile(watermarkPath); if (image.Height < y) throw new Exception("水印高度超出图片高度!"); if (image.Width < x) throw new Exception("水印宽度超出图片宽度!"); Graphics graphics = Graphics.FromImage(image);//画板 copyImage = Transparent(copyImage, transparentImage, transparent);//生成透明图片并返回 graphics.DrawImage( copyImage, //水印图片 new Rectangle(x, y, copyImage.Width, copyImage.Height), //水印图片的坐标x,y和水印图片的宽高 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel ); graphics.Dispose(); //保存加水印过后的图片,删除原始图片 image.Save(targetPath); image.Dispose(); } catch (Exception ex) { throw ex; } } #endregion #region 生成透明图片 /// <summary> /// 生成透明图片 /// </summary> /// <param name="image">水印图片</param> /// <param name="transparentImage">透明图片保存路径</param> /// <param name="transparent">透明百分比</param> /// <returns>返回透明图片</returns> public Image Transparent(Image image,string transparentImage, int transparent) { float iiii = (float)(transparent / 100.0); float[][] nArray ={ 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, iiii, 0.0f}, new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}}; //颜色变换矩阵的一种简便方法iiii位置是设置透明度的范围0到1中的单精度类型 ColorMatrix matrix = new ColorMatrix(nArray); //定义一个 5 x 5 矩阵 ImageAttributes attributes = new ImageAttributes(); attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); Bitmap resultImage = new Bitmap(image.Width, image.Height);//图片流 Graphics g = Graphics.FromImage(resultImage); g.DrawImage( image, new Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes ); resultImage.Save(transparentImage);//保存图片 System.Drawing.Image img = image = System.Drawing.Image.FromFile(transparentImage); return img; } #endregion
图片水印从网上找有很多,但全的还是不多,我写了个全点的透明度水印,透明图片也查了很多资料才弄出来,是用。net只带的5*5矩阵实现的,iiii部分是计算后透明百分比,(值范围0.0到1.0为单精度值)注意切记 如果你要直接写值的话后面加个f(例如0.1f),不加会报错,这个我也不知道为什么。
如果不需要图片透明只要把
copyImage = Transparent(copyImage, transparentImage, transparent);//生成透明图片并返回
这段代码注释就ok了,下面的方法也可以单独使用。这里为了方便直接返回成image格式。
小弟初涉it行业很多都不怎么懂,写的不好请各位多加指点。

浙公网安备 33010602011771号