根据大家的意见,教程加入了关于透明的处理。
做网站的时候经常需要将图片加上网站名称的水印。这样做可以使别人转载图片的时候出现图片出处,利于网站宣传。但是如果利用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。
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的时候就可以输出图片了。
二、全局Handler:
在aspx里面输入<asp:Image ID="Image1" runat="server" ImageUrl="image/book1.jpg" /> 就可以了。不需要请求Handler。然后在项目中单击右键添加新项,选择类。然后输入如下代码:
MyBookMark 的摘要说明
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[] {1, 0, 0, 0, 0},
48 new float[] {0, 1, 0, 0, 0},
49 new float[] {0, 0, 1, 0, 0},
50 new float[] {0, 0, 0,alpha , 0},
51 new float[] {0, 0, 0, 0, 1}};
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中处理了。同样也输出带水印的图片。