使用一般处理程序(IHttpHandler)制作图片水印2011-08-25 博客园 佟伟做网站的时候经常需要将图片加上网站名称的水印。这样做可以使别人转载图片的时候出现图片出处 ,利于网站宣传。但是如果利用ps来一个一个加水印工作量非常浩大,而且修改了之后就没法还原。这 篇教程教大家利用一般处理程序(Handler)制作图片水印,这种水印的优点是一经修改全站适用,而且 不改变原来的图片。制作水印分为两种方法,一种是利用局部Handler,另一种是利用全局Handler。前者可以灵活的选择 文件夹内的图片是否都加水印,但印。为了节省篇幅Handler的教程就不写了。是每次做链接的时候都要 加入Handler地址,不利于整体修改。而后者是指定文件夹里的图片都加水印。一、局部Handler:1.在aspx页面中写入
<asp:Image ID="Image1" runat="server" ImageUrl="~/MyBookHandler.ashx?title=9221944" />
这句话加入一个Image服务器控件,图片地址指向~/MyBookHandler.ashx?title=9221944。也就是根 目录下的MyBookHandler.ashx。(其中title为图片名)2.添加一般处理程序MyBookHandler.ashx。MyBookHandler内容
1<%@ WebHandler Language="C#" Class="MyBookHandler" %>
 2
 3 using System;
 4 using System.Web;
 5 using System.Drawing;
 6 using System.Drawing.Imaging;
 7 using System.IO;
 8
 9 public class MyBookHandler : IHttpHandler
10 {
11
12 private string imagepath = "~/image/"; //图片所在的文件夹
13 private const string waterimage = "~/image/Watermark.jpg"; //水印图片
14 private const string defaultimage = "~/image/default.jpg"; //没有找到图片时显示的图片
15 private const float alpha = 0.5F; //透明度
16
17 public void ProcessRequest(HttpContext context)
18 {
19 imagepath += context.Request.QueryString["imagename"] + ".jpg";//获得图片名称
20 Image image; //图片类
21 //如果文件夹内存在图片context.Request.MapPath获得物理地址
22 if (File.Exists(context.Request.MapPath(imagepath)))
23 {
24 image = Image.FromFile(context.Request.MapPath(imagepath));//将图片内容放到image对象
25 Graphics g = Graphics.FromImage(image); //获得Graphics 对象
26 Image watermark = Image.FromFile(context.Request.MapPath(waterimage));//将水印图片放入watermark 对象
27 //关于透明度(使用颜色矩阵)
28 float[][] nArray ={ new float[] {1, 0, 0, 0, 0},
29 new float[] {0, 1, 0, 0, 0},
30 new float[] {0, 0, 1, 0, 0},
31 new float[] {0, 0, 0,alpha , 0},
32 new float[] {0, 0, 0, 0, 1}};
33 ColorMatrix colormatrix = new ColorMatrix(nArray);
34 ImageAttributes attributes = new ImageAttributes();
35 attributes.SetColorMatrix(colormatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
36 g.DrawImage(watermark, new Rectangle(image.Width - watermark.Width, image.Height - watermark.Height,
37 watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, attributes);//在图片指定坐标处放入一个矩形图片内容为水印图片
38 g.Dispose();
39 watermark.Dispose();
40 }
41 else
42 {
43 image = Image.FromFile(context.Request.MapPath(defaultimage));//如果不存在图片就输出defaultimage。
44 }
45 context.Response.ContentType = "image/jpeg";//输出图片的类型
46 image.Save(context.Response.OutputStream, ImageFormat.Jpeg);//将图片存入输出流
47 image.Dispose();
48 context.Response.End();
49 }
50
51 public bool IsReusable
52 {
53 get
54 {
55 return false;
56 }
57 }
58}
这样当Image控件访问Handler的时候就可以输出图片了。