作網站的時候常常須要將圖片加上網站名稱的水印。這樣作可使別人轉載圖片的時候出現圖片出處 ,利於網站宣傳。可是若是利用ps來一個一個加水印工做量很是浩大,並且修改了以後就無法還原。這 篇教程教你們利用通常處理程序(Handler)製做圖片水印,這種水印的優勢是一經修改全站適用,並且不改變原來的圖片。web
製做水印分爲兩種方法,一種是利用局部Handler,給指定路徑的圖片添加水印;另外一種是利用全局Handler。前者能夠靈活的選擇指定的圖片添加水印,可是不方便的是每次作連接的時候都要 加入Handler地址,不利於總體修改。然後者是指定文件夾裏的圖片都加水印。函數
1、局部Handler:網站
1.添加通常處理程序WaterMarkHandler.ashx。spa
<%@ WebHandler Language="C#" Class="WaterMarkHandler" %> using System; using System.Web; using System.IO; using System.Drawing; public class WaterMarkHandler : IHttpHandler { string waterPath = "~/images/1/WaterMark.png";//水印圖片路徑 string defaultPath = "~/images/1/default.jpg";//默認圖片路徑 public void ProcessRequest (HttpContext context) { string coverPath =context.Server.MapPath(context.Request.Params["path"]); Image cover; if (File.Exists(coverPath)) { //加載圖片 cover = Image.FromFile(coverPath); //加載水印圖片 Image water = Image.FromFile(context.Request.MapPath(waterPath)); //實例化畫布 Graphics g = Graphics.FromImage(cover); //繪製圖片 g.DrawImage(water, new Rectangle(cover.Width - water.Width, cover.Height - water.Height, water.Width, water.Height), 0, 0, water.Width,water.Height,GraphicsUnit.Pixel); //釋放畫布 g.Dispose(); //釋放水印 water.Dispose(); } else//沒有圖片,顯示默認圖片 { cover = Image.FromFile(context.Request.MapPath(defaultPath)); } context.Response.ContentType = "image/jpeg"; cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); cover.Dispose(); context.Response.End(); } public bool IsReusable { get { return false; } } }
2.在aspx頁面中調用HttpHandler:debug
<img src="WaterMarkHandler.ashx?path=images/9787115161321.jpg" />
這樣當Image控件訪問Handler的時候就能夠輸出圖片了。code
2、全局Handler:orm
這個方法不須要建立HttpHandler.ashx,只須要在App_Code文件夾裏面建立一個類便可,而後在配置文件中指定這個類,而在aspx訪問圖片的頁面不須要任何改變:對象
1.配置Web.config:blog
<system.web> <compilation debug="true" targetFramework="4.0" /> <httpHandlers> <add verb="*" path="images/*.jpg" type="WaterMarkHandler" /> </httpHandlers> </system.web>
2.全局Handler WaterMarkHandler的代碼:教程
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.IO; /// <summary> ///CoverHandler 的摘要說明 ///1.配置配置文件,以捕獲圖片的訪問請求 ///2.建立類文件CoverHandler.cs ///3.實現IHttpHandler接口的方法 /// </summary> public class WaterMarkHandler : IHttpHandler { public WaterMarkHandler() { // //TODO: 在此處添加構造函數邏輯 // } //4. 設置不能容許重用 public bool IsReusable { get { return false; } } //5. 編寫最終處理程序 public void ProcessRequest(HttpContext context) { //1 獲取封面圖片,水印圖片,默認圖片的路徑 string coverPath = context.Request.PhysicalPath; string waterPath = context.Server.MapPath("~/images/1/default.jpg");//水印圖片 string defaultPath = context.Server.MapPath("~/images/1/default.jpg");//默認圖片 //2.繪製圖片 Image Cover;//定義封面圖片對象 if (File.Exists(coverPath))// **注意:根據物理路徑進行判斷文件是否存在** { //2.1 加載封面圖片 Cover = Image.FromFile(coverPath); //2.2 加載水印圖片 Image water = Image.FromFile(waterPath); //2.3實例化畫布 **已封面圖片做爲畫布** Graphics g = Graphics.FromImage(Cover); //2.4繪製封面圖片 g.DrawImage(water, //水印圖片 new Rectangle(Cover.Width - water.Width, Cover.Height - water.Height, water.Width, water.Height), 0, //橫向偏移 0, //縱向偏移 water.Width, //繪製寬度 water.Height, //繪製高度 GraphicsUnit.Pixel);//畫筆大小 //2.5 釋放畫布,水印 g.Dispose(); water.Dispose(); } else//若是圖片不存在,使用默認圖片 { //2.6 設置默認頁面爲封面圖片 Cover = Image.FromFile(defaultPath); } //3 設置輸出內容類型 context.Response.ContentType = "image/jpeg"; //4 將修改的圖片保存到文件流中 Cover.Save(context.Response.OutputStream, //要保存到的文件輸出流 System.Drawing.Imaging.ImageFormat.Jpeg); //保存文件類型 //5. 釋放圖片 Cover.Dispose(); context.Response.End(); } } //注意事項: //1.配置配置文件,以捕獲圖片的訪問請求 //2.CoverHandler.cs要在網站中建立類,並按提示保存在App_Code文件夾下,不可以使用"通常處理程序"; //3.實現IHttpHandler接口的方法; //4. 設置不能容許重用; //5. 編寫最終處理程序