使用通常處理程序(IHttpHandler)製做圖片水印

作網站的時候常常須要將圖片加上網站名稱的水印。這樣作可使別人轉載圖片的時候出現圖片出處 ,利於網站宣傳。可是若是利用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. 編寫最終處理程序
相關文章
相關標籤/搜索