IhttpHandler給圖片添加水印

給圖片添加水印,通常的作法是在上傳圖片時直接給圖片添加上水印,因爲我在項目中使用了FCKeditor,在上傳時不易控制,同時對方還要求他們本身用時不能有水印,因而我就使用了在圖片顯示時動態添加水印的辦法,另外,爲了提升效率,還使用了緩存技術,這樣沒必要每次都添加水印,節省時間和提升性能。html

本文中使用到的類是IHttpHandler(準確地說是一個接口),msdn對它的定義是:「定義 ASP.NET 爲使用自定義 HTTP 處理程序同步處理 HTTP Web 請求而實現的協定。」HTTP處理程序是實現了System.Web.IHttpHandler接口的.NET組件,任何實現了IHttpHandler接口的類均可以用於處理輸入的HTTP請求。也就是每次咱們請求asp.net網站上的資源,都會由這個請求處理,這樣就好控制了。web

個人作法是,實現IHttpHandler接口,由實現這個接口的ImageHandler類專門處理對圖片資源的請求,第一次請求某個圖片時,因爲緩存中沒有,就讀取這個圖片,添加上咱們指定的水印(由web.config設置指定),而後把輸出到客戶端,同時也把它緩存必定時間,在緩存期內就再次請求這個圖片就不用添加水印了,直接把緩存中的圖片輸出就好了。緩存

首先咱們要編寫本身的類ImageHandler實現IHttpHandler接口,代碼以下:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Imaging;安全

/// <summary>
///ImageHandler 的摘要說明
/// </summary>
public class ImageHandler:IHttpHandler
{
 public ImageHandler()
 {
  //
  //TODO: 在此處添加構造函數邏輯
  //
 }app

    #region IHttpHandler 成員asp.net

    public bool IsReusable
    {
        get { return true ; }
    }ide

    public void Proce***equest(HttpContext context)
    {
        string p_w_picpathpath = context.Request.PhysicalPath;
        Bitmap p_w_picpath = null;
        if (context.Cache[p_w_picpathpath] == null)
        {
            p_w_picpath = new Bitmap(p_w_picpathpath);
            p_w_picpath = AddWaterMark(p_w_picpath);
            context.Cache[p_w_picpathpath] = p_w_picpath;
        }
        else
        {
            p_w_picpath = context.Cache[p_w_picpathpath] as Bitmap;
        }
        p_w_picpath.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    }
    //給圖片添加水印
    private Bitmap AddWaterMark(Bitmap p_w_picpath)
    {
        string text = System.Configuration.ConfigurationManager.AppSettings["WaterMark"].ToString();
        int fontSize = int.Parse(System.Configuration.ConfigurationManager.AppSettings["Font-Size"].ToString());
        Font font = new Font("宋體", fontSize);函數

        //Brush brush = Brushes.DarkGray;
        Brush brush = Brushes.Red;
        Graphics g = Graphics.FromImage(p_w_picpath);
        SizeF size = g.MeasureString(text, font);
        g.DrawString(text, font, brush, p_w_picpath.Width - size.Width, p_w_picpath.Height - size.Height);
        g.Dispose();
        return p_w_picpath;
    }工具


    #endregion
}
 性能

能夠把這個類編譯成一個單獨的dll文件,不過我如今是演示,直接放在了App_Code文件夾下了。

html頁面以下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>無標題頁</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <img src="Images/1.jpg" /><br />
    <img src="Images/2.jpg" /><br />
    <img src="3.jpg" /><br />
    </div>
    </form>
</body>
</html>
最後咱們還須要對web.config作一些配置,一是定義咱們要添加的水印文字,二是定義文字大小,三是將咱們本身的HttpHandler註冊到網站,個人web.config文件以下:
 

<? xml version="1.0" ?>
<!--  
    注意: 除了手動編輯此文件之外,您還可使用 
    Web 管理工具來配置應用程序的設置。可使用 Visual Studio 中的
     「網站」->「Asp.Net 配置」選項。
    設置和註釋的完整列表在 
    machine.config.comments 中,該文件一般位於 
    WindowsMicrosoft.NetFrameworkv2.xConfig 中
-->
< configuration >
    
< appSettings >
        
<!-- 添加到圖片上的水印文字 -->
        
< add  key ="WaterMark"  value ="公司網址" />
        
<!-- 水印文字的字體大小 -->
        
< add  key ="Font-Size"  value ="14" />
    
</ appSettings >
    
< connectionStrings />
    
< system .web >
         < compilation  debug ="true" />
        
<!--
            經過 <authentication> 節能夠配置 ASP.NET 使用的 
            安全身份驗證模式,
            以標識傳入的用戶。 
        
-->
        
< authentication  mode ="Windows" />
         < httpHandlers >
      
<!-- 只處理UploadImages目錄下的jpg文件,別的目錄下的圖片不處理 -->
            
< add  path ="Images/*.jpg"  verb ="*"  type ="ImageHandler" />
        
</ httpHandlers >
    
</ system.web >
</ configuration >
 
在web.comfig中我添加了3處,在<appSettings>節點中的配置我就不細說了,主要說說<httpHandlers>節點中的配置,在這裏個人配置是:
<add path="Images/*.jpg" verb="*" type="ImageHandler"/>

它代表只處理網站根目錄下的Images文件夾中的圖片,在本實例中Upload文件夾也有圖片,但是這個文件夾下的圖片是網站logo等常規圖片,不須要處理,因此這個元素的path屬性值是:path="Images/*.jpg",若是你想給全部jpg圖片添加水印,能夠寫成path="*.jpg",在接下來的頁面中咱們就會看到結果如咱們所願,在Upload目錄下的圖片真的沒有添加水印,而在Images確實添加了水印!

 

最後說明:(一)在這兒我將水印文字字體設置爲14,同時仍是用了醒目的紅色,在實際項目中須要根據圖片大小計算文字大小,文字顏色不宜過於鮮明;(二)爲了演示,緩存使用過於簡單,還能夠進行一些更負責的設置,更大程度節省內存。(三)添加水印圖片原理也很簡單,使用GDI+將水印圖片畫在要添加水印的圖片上便可;(四)即便單獨在地址欄輸入圖片的url地址,看到的圖片也同樣會有水印。

相關文章
相關標籤/搜索