給圖片添加水印,通常的作法是在上傳圖片時直接給圖片添加上水印,因爲我在項目中使用了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文件以下:
它代表只處理網站根目錄下的Images文件夾中的圖片,在本實例中Upload文件夾也有圖片,但是這個文件夾下的圖片是網站logo等常規圖片,不須要處理,因此這個元素的path屬性值是:path="Images/*.jpg",若是你想給全部jpg圖片添加水印,能夠寫成path="*.jpg",在接下來的頁面中咱們就會看到結果如咱們所願,在Upload目錄下的圖片真的沒有添加水印,而在Images確實添加了水印!
最後說明:(一)在這兒我將水印文字字體設置爲14,同時仍是用了醒目的紅色,在實際項目中須要根據圖片大小計算文字大小,文字顏色不宜過於鮮明;(二)爲了演示,緩存使用過於簡單,還能夠進行一些更負責的設置,更大程度節省內存。(三)添加水印圖片原理也很簡單,使用GDI+將水印圖片畫在要添加水印的圖片上便可;(四)即便單獨在地址欄輸入圖片的url地址,看到的圖片也同樣會有水印。