圖片加浮水印的方法有很多,這裡先對臨時加浮水印的方法進行下介紹
臨時加浮水印:
就是在響應使用者請求時對響應中的圖片在內在中加浮水印,然後寫入輸出資料流,傳到用戶端。
這樣就能實現在不改變原圖的情況下,呈現給客戶浮水印圖片
首先我們需要定義一個實現IHttpHandler 介面的類:
using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;</p><p>using System.Drawing;</p><p>/// <summary><br />/// HandlerImageOpener 的摘要說明<br />/// </summary><br />public class HandlerImageOpener : IHttpHandler<br />{<br /> public HandlerImageOpener()<br /> {<br /> //<br /> // TODO: 在此處添加建構函式邏輯<br /> //<br /> }</p><p> private string _path = "";<br /> /// <summary><br /> /// 浮水印圖片路徑<br /> /// </summary><br /> public string PngPath<br /> {<br /> get<br /> {<br /> if (_path == "")<br /> {<br /> _path = System.Web.HttpContext.Current.Server.MapPath(System.Configuration.ConfigurationSettings.AppSettings["WatermarkedImagePath"]);<br /> }<br /> return _path;<br /> }<br /> }</p><p> /// <summary><br /> /// 為圖片加浮水印並寫入到Response.OutputStream<br /> /// </summary><br /> /// <param name="hc">內容物件</param><br /> public void GetNewBitMap(HttpContext hc)<br /> {<br /> // 載入原圖片<br /> Bitmap oldBmp = new Bitmap(System.Drawing.Image.FromFile(hc.Request.PhysicalPath)); </p><p> int newWidth = oldBmp.Width;<br /> int newHeight = oldBmp.Height;</p><p> if (oldBmp != null)<br /> {<br /> // 綁定畫板<br /> Graphics grap = Graphics.FromImage(oldBmp); </p><p> // 載入浮水印圖片<br /> Bitmap bt = new Bitmap(PngPath); </p><p> // 浮水印位置控制<br /> int pH = GetNewPoint(newHeight, bt.Height, true);<br /> int pW = GetNewPoint(newWidth, bt.Width, false);</p><p> if (newHeight < pH * 8)<br /> pH = pH / 2;<br /> if (newWidth < pW)<br /> pW = pW / 2 / 2;</p><p> int pX = newHeight - pH;<br /> int pY = newWidth - pW - 3;</p><p> // 添加浮水印<br /> grap.DrawImage(bt, pY, pX, pW, pH);</p><p> // 寫入到輸出資料流<br /> oldBmp.Save(hc.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);<br /> }<br /> }</p><p> // 控制寬高<br /> private int GetNewPoint(int oldP, int newP, bool isW)<br /> {<br /> int p = 4;<br /> if (isW)<br /> {<br /> p = 16;<br /> }<br /> if (oldP < (newP * p))<br /> {<br /> newP /= 2;<br /> if (oldP < (newP * p))<br /> {<br /> GetNewPoint(oldP, newP, isW);<br /> }<br /> }<br /> return newP;<br /> }</p><p> #region IHttpHandler 成員</p><p> bool IHttpHandler.IsReusable<br /> {<br /> get { return true; }<br /> }</p><p> void IHttpHandler.ProcessRequest(HttpContext context)<br /> {<br /> GetNewBitMap(context);<br /> }</p><p> #endregion<br />}<br />
然後在設定檔中引用這個處理類/並配置浮水印圖片位置:
<!--浮水印圖片路徑--><br /><appSettings><br /> <add key="WatermarkedImagePath" value="~/logopng.png"/><br /></appSettings></p><p><!--引用處理函數 path為需要加浮水印圖片的目錄--><br /><httpHandlers><br /><add type="HandlerImageOpener" verb="*" path="image/*.jpg,image/*.gif,image/*.png,image/*.bmp" /><br /></httpHandlers>
完成。
這樣在頁面被訪問的時候,path目錄下的圖片會被自動加上浮水印