做网站的时候经常需要将图片加上网站名称的水印。这样做可以使别人转载图片的时候出现图片出处,利于网站宣传。但是如果利用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。


 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     private string coverimage = "~/image/"//图片所在的文件夹
12     private const string waterimage = "~/image/Watermark.jpg"//水印图片
13     private const string defaultimage = "~/image/default.jpg"//没有找到图片时显示的图片
14 
15     public void ProcessRequest(HttpContext context)
16     {
17         coverimage += context.Request.QueryString["title"+ ".jpg";//获得图片名称
18         Image Cover; //图片类
19          //如果文件夹内存在图片context.Request.MapPath获得物理地址
20         if (File.Exists(context.Request.MapPath(coverimage))) 
21         {
22             Cover = Image.FromFile(context.Request.MapPath(coverimage));//将图片内容放到Cover对象
23             Graphics g = Graphics.FromImage(Cover); //获得Graphics 对象
24             Image watermark = Image.FromFile(context.Request.MapPath(waterimage));//将水印图片放入watermark 对象
25             g.DrawImage(watermark, new Rectangle(Cover.Width - watermark.Width, Cover.Height - watermark.Height, 
26 
27 watermark.Width, watermark.Height), 00, watermark.Width, watermark.Height, GraphicsUnit.Pixel);//在图片底部放入一
28 
29 个矩形图片内容为水印图片
30             g.Dispose();
31             watermark.Dispose();
32         }
33         else
34         {
35             Cover = Image.FromFile(context.Request.MapPath(defaultimage));//如果不存在图片就输出defaultimage。
36          }
37         context.Response.ContentType = "image/jpeg";//输出图片的类型
38          Cover.Save(context.Response.OutputStream,ImageFormat.Jpeg);//将图片存入输出流
39          Cover.Dispose();
40         context.Response.End();
41     }
42 
43     public bool IsReusable
44     {
45         get
46         {
47             return false;
48         }
49     }
50 }

这样当Image控件访问Handler的时候就可以输出图片了。

二、全局Handler:

在aspx里面输入 <asp:Image ID="Image1" runat="server" ImageUrl="image/9221944.jpg" />就可以了。不需要请求Handler。然后在项目中单击右键添加新项,选择类。然后输入如下代码:


 1 using System;
 2 using System.Data;
 3 using System.Configuration;
 4 using System.Web;
 5 using System.Web.Security;
 6 using System.Web.UI;
 7 using System.Web.UI.WebControls;
 8 using System.Web.UI.WebControls.WebParts;
 9 using System.Web.UI.HtmlControls;
10 using System.IO;
11 using System.Drawing.Imaging;
12 
13 /// <summary>
14 /// MyBookMark 的摘要说明
15 /// </summary>
16 public class MyBookMark : IHttpHandler
17 {
18     public MyBookMark()
19     {
20         //
21         // TODO: 在此处添加构造函数逻辑
22         //
23     }
24 
25     #region IHttpHandler 成员
26 
27    public bool IsReusable
28     {
29         get { return false; }
30     }
31 
32     private const string waterimage = "~/image/Watermark.jpg";
33     private const string defaultimage = "~/image/default.jpg";
34 
35     public void ProcessRequest(HttpContext context)
36     {
37 
38         System.Drawing.Image Cover;
39 
40         if (System.IO.File.Exists(context.Request.PhysicalPath))
41         {
42             Cover = System.Drawing.Image.FromFile(context.Request.PhysicalPath);
43             System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(Cover);
44             System.Drawing.Image watermark = System.Drawing.Image.FromFile(context.Request.MapPath(waterimage));
45             g.DrawImage(watermark, new System.Drawing.Rectangle(Cover.Width - watermark.Width, Cover.Height - watermark.Height, watermark.Width, watermark.Height), 00, watermark.Width, watermark.Height, System.Drawing.GraphicsUnit.Pixel);
46             g.Dispose();
47             watermark.Dispose();
48         }
49         else
50         {
51             Cover = System.Drawing.Image.FromFile(context.Request.MapPath(defaultimage));
52         }
53         context.Response.ContentType = "image/jpeg";
54         Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
55         Cover.Dispose();
56         context.Response.End();
57     }
58 
59     #endregion
60 }

跟局部Handler一样就不写说明了。

为了能触发这个Handler需要在web.config文件的<httpHandlers>配置节里面输入如下信息。

 <add verb="*" path="image/*.jpg" type="MyBookMark"/>

这样当请求为image/*.jpg的时候就转到MyBookMark这个Handler中处理了。同样也输出带水印的图片。

 

原Blog http://www.cnblogs.com/willonline/archive/2009/06/21/1507866.html

posted on 2009-06-22 13:30  许维光  阅读(269)  评论(0)    收藏  举报