龙鱼家园,个性,交流,技术,专注于网站技术的研究 龙鱼家园 | 使用一般处理程序(IHttpHandler)制作图片水印

使用一般处理程序(IHttpHandler)制作图片水印

   根据大家的意见,教程加入了关于透明的处理。

      做网站的时候经常需要将图片加上网站名称的水印。这样做可以使别人转载图片的时候出现图片出处,利于网站宣传。但是如果利用ps来一个一个加水印工作量非常浩大,而且修改了之后就没法还原。这篇教程教大家利用一般处理程序(Handler)制作图片水印,这种水印的优点是一经修改全站适用,而且不改变原来的图片。

      制作水印分为两种方法,一种是利用局部Handler,另一种是利用全局Handler。前者可以灵活的选择文件夹内的图片是否都加水印,但印。为了节省篇幅Handler的教程就不写了。是每次做链接的时候都要加入Handler地址,不利于整体修改。而后者是指定文件夹里的图片都加水印。

一、局部Handler:

1.在aspx页面中写入

 <asp:Image ID="Image1" runat="server" ImageUrl="~/MyBookHandler.ashx?imagename=book1" />

这句话加入一个Image服务器控件,图片地址指向~/MyBookHandler.ashx?imagename=book1。也就是根目录下的MyBookHandler.ashx。(其中imagename为图片名)

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 
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[] {10000},
29             new float[] {01000},
30             new float[] {00100},
31             new float[] {000,alpha , 0},
32             new float[] {00001}};
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), 00, 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的时候就可以输出图片了。

二、全局Handler:

在aspx里面输入<asp:Image ID="Image1" runat="server" ImageUrl="image/book1.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 using System.Drawing;
13 
14 /// <summary>
15 /// MyBookMark 的摘要说明
16 /// </summary>
17 public class MyBookMark : IHttpHandler
18 {
19     public MyBookMark()
20     {
21         //
22         // TODO: 在此处添加构造函数逻辑
23         //
24     }
25 
26     #region IHttpHandler 成员
27 
28    public bool IsReusable
29     {
30         get { return false; }
31     }
32 
33    private const string waterimage = "~/image/Watermark.jpg"//水印图片
34    private const string defaultimage = "~/image/default.jpg"//没有找到图片时显示的图片
35    private const float alpha = 0.5F//透明度
36 
37     public void ProcessRequest(HttpContext context)
38     {
39 
40         System.Drawing.Image image;
41 
42         if (System.IO.File.Exists(context.Request.PhysicalPath))
43         {
44             image = System.Drawing.Image.FromFile(context.Request.PhysicalPath);
45             System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
46             System.Drawing.Image watermark = System.Drawing.Image.FromFile(context.Request.MapPath(waterimage));
47             float[][] nArray =new float[] {10000},
48             new float[] {01000},
49             new float[] {00100},
50             new float[] {000,alpha , 0},
51             new float[] {00001}};
52             ColorMatrix colormatrix = new ColorMatrix(nArray);
53             ImageAttributes attributes = new ImageAttributes();
54             attributes.SetColorMatrix(colormatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
55             g.DrawImage(watermark, new Rectangle(image.Width - watermark.Width, image.Height - watermark.Height,
56 watermark.Width, watermark.Height), 0,0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, attributes);//在图片指定坐标处放入一个矩形图片内容为水印图片
57             g.Dispose();
58             watermark.Dispose();
59         }
60         else
61         {
62             image = System.Drawing.Image.FromFile(context.Request.MapPath(defaultimage));
63         }
64         context.Response.ContentType = "image/jpeg";
65         image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
66         image.Dispose();
67         context.Response.End();
68     }
69 
70     #endregion
71 }
72 

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

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

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

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

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


龙鱼家园专题

  • Asp.net技术推荐书
  • Search

    友情链接

  • 代码发芽网
  • 清清月儿
  • 资质通鉴
  • MSPROJECT开源技术
  • 技能云
  • 二频
  • dotnetblogengine
  • 苹果树下
  • 译言
  • 联系我:
    leonardleonard@126.com

    © Copyright 2010