水印,就是指在原圖片上添加一些自己的東西,比如自己網站的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,所以也沒有循環的給文件夾下的所有圖片去添加水印了,需要的同學可以自己試試哈。由於時間的關系,水印的另一種方式圖片水印今天就不寫了,下次再和大家分享。
希望能夠給需要的朋友一點幫助,您的支持,我最大的動力,謝謝!