水印,就是指在原图片上添加一些自己的东西,比如自己网站的logo或者签名之类的,这样别人转载的时候就会带上自己版权的信息,这对于网络中防盗链非常有效。即使是别人把你的图片转走了,也会带上专属于你的信息,通俗一点就是类似于你为这个图片盖了一个章。
给图片添加水印常用的有图片水印和文字水印,网上也有很多生成水印的工具,但是作为一个屌丝,不管好与不好,是不是用自己手写的工具会更爽呢?本文仅仅是提供了一种实现的方法,肯定还有其他好的方法,欢迎大家来一起交流。
由于楼主是一个务实的人,不喜欢整太多虚无缥缈的,所以程序的界面都是原生态的哈,呵呵,有需要的童鞋可以自己去添加样式改造。好了,不多说,先上图看一下效果。
图1为原图,图2-图6为添加水印之后的图片。
图-1 原图 图-2 左上角加水印 图-2 右上角加水印
图-3 左下角加水印 图-3 中间加水印 图-3 右下角加水印
整个程序的结构跟之前的那篇文章快速生成缩略图的结构一样,一个简单的前台显示界面,一个Handler。前台将图片的原图路径和保存路径传到后台,然后通过Handler去处理,虽然代码很简单,但是分工还是很明确,各司其责,互不干扰。对水印的位置,通过如下的枚举来控制:
public enum WaterPositionMode { LeftTop, LeftBottom, RightTop, RightBottom, Center }
前台页面:
Handler中通过一个方法来处理生成图片的水印。主要代码:
public static void AddWaterText(string oldpath,string savepath,string watertext,WaterPositionMode position,string color,int alpha) { Image image = Image.FromFile(oldpath); Bitmap bitmap=new Bitmap(image.Width,image.Height); Graphics graphics = Graphics.FromImage(bitmap); graphics.Clear(Color.White); graphics.DrawImage(image,new Rectangle(0,0,image.Width,image.Height),0,0,image.Width,image.Height,GraphicsUnit.Pixel); Font font=new Font("arial",18); SizeF ziSizeF=new SizeF(); ziSizeF = graphics.MeasureString(watertext, font); float x = 0f; float y = 0f; switch (position) { case WaterPositionMode.LeftTop: x = ziSizeF.Width/2f; y = 8f; break; case WaterPositionMode.LeftBottom: x = ziSizeF.Width/2f; y = image.Height - ziSizeF.Height; break; case WaterPositionMode.RightTop: x = image.Width*1f - ziSizeF.Width/2f; y = 8f; break; case WaterPositionMode.RightBottom: x = image.Width - ziSizeF.Width; y = image.Height - ziSizeF.Height; break; case WaterPositionMode.Center: x = image.Width/2; y = image.Height/2 - ziSizeF.Height/2; break; } try { StringFormat stringFormat = new StringFormat {Alignment = StringAlignment.Center}; SolidBrush solidBrush = new SolidBrush(Color.FromArgb(alpha, 0, 0, 0)); graphics.DrawString(watertext, font, solidBrush, x + 1f, y + 1f, stringFormat); SolidBrush brush = new SolidBrush(Color.FromArgb(alpha, ColorTranslator.FromHtml(color))); graphics.DrawString(watertext, font, brush, x, y, stringFormat); solidBrush.Dispose(); brush.Dispose(); bitmap.Save(savepath, ImageFormat.Jpeg); } catch (Exception e) { } finally { bitmap.Dispose(); image.Dispose(); } }
这样就能完美的生成水印图片了哦。当然了,由于只是做一个小的Demo,所以也没有循环的给文件夹下的所有图片去添加水印了,需要的同学可以自己试试哈。由于时间的关系,水印的另一种方式图片水印今天就不写了,下次再和大家分享。
希望能够给需要的朋友一点帮助,您的支持,我最大的动力,谢谢!