制作水印分为两种方法,一种是利用局部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), 0, 0, 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), 0, 0, 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
浙公网安备 33010602011771号