做网站的时候经常需要将图片加上网站名称的水印。这样做可以使别人转载图片的时候出现图片出处 ,利于网站宣传。但是如果利用ps来一个一个加水印工作量非常浩大,而且修改了之后就没法还原。这 篇教程教大家利用一般处理程序(Handler)制作图片水印,这种水印的优点是一经修改全站适用,而且不改变原来的图片。
制作水印分为两种方法,一种是利用局部Handler,给指定路径的图片添加水印;另一种是利用全局Handler。前者可以灵活的选择指定的图片添加水印,但是不方便的是每次做链接的时候都要 加入Handler地址,不利于整体修改。而后者是指定文件夹里的图片都加水印。
一、局部Handler:
1.添加一般处理程序WaterMarkHandler.ashx。
<%@ WebHandler Language="C#" Class="WaterMarkHandler" %> using System; using System.Web; using System.IO; using System.Drawing; public class WaterMarkHandler : IHttpHandler { string waterPath = "~/images/1/WaterMark.png";//水印图片路径 string defaultPath = "~/images/1/default.jpg";//默认图片路径 public void ProcessRequest (HttpContext context) { string coverPath =context.Server.MapPath(context.Request.Params["path"]); Image cover; if (File.Exists(coverPath)) { //加载图片 cover = Image.FromFile(coverPath); //加载水印图片 Image water = Image.FromFile(context.Request.MapPath(waterPath)); //实例化画布 Graphics g = Graphics.FromImage(cover); //绘制图片 g.DrawImage(water, new Rectangle(cover.Width - water.Width, cover.Height - water.Height, water.Width, water.Height), 0, 0, water.Width,water.Height,GraphicsUnit.Pixel); //释放画布 g.Dispose(); //释放水印 water.Dispose(); } else//没有图片,显示默认图片 { cover = Image.FromFile(context.Request.MapPath(defaultPath)); } context.Response.ContentType = "image/jpeg"; cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); cover.Dispose(); context.Response.End(); } public bool IsReusable { get { return false; } } }
2.在aspx页面中调用HttpHandler:
<img src="WaterMarkHandler.ashx?path=images/9787115161321.jpg" />
这样当Image控件访问Handler的时候就可以输出图片了。
二、全局Handler:
这个方法不需要创建HttpHandler.ashx,只需要在App_Code文件夹里面创建一个类即可,然后在配置文件中指定这个类,而在aspx访问图片的页面不需要任何改变:
1.配置Web.config:
<system.web> <compilation debug="true" targetFramework="4.0" /> <httpHandlers> <add verb="*" path="images/*.jpg" type="WaterMarkHandler" /> </httpHandlers> </system.web>
2.全局Handler WaterMarkHandler的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.IO; /// <summary> ///CoverHandler 的摘要说明 ///1.配置配置文件,以捕获图片的访问请求 ///2.创建类文件CoverHandler.cs ///3.实现IHttpHandler接口的方法 /// </summary> public class WaterMarkHandler : IHttpHandler { public WaterMarkHandler() { // //TODO: 在此处添加构造函数逻辑 // } //4. 设置不能允许重用 public bool IsReusable { get { return false; } } //5. 编写最终处理程序 public void ProcessRequest(HttpContext context) { //1 获取封面图片,水印图片,默认图片的路径 string coverPath = context.Request.PhysicalPath; string waterPath = context.Server.MapPath("~/images/1/default.jpg");//水印图片 string defaultPath = context.Server.MapPath("~/images/1/default.jpg");//默认图片 //2.绘制图片 Image Cover;//定义封面图片对象 if (File.Exists(coverPath))// **注意:根据物理路径进行判断文件是否存在** { //2.1 加载封面图片 Cover = Image.FromFile(coverPath); //2.2 加载水印图片 Image water = Image.FromFile(waterPath); //2.3实例化画布 **已封面图片作为画布** Graphics g = Graphics.FromImage(Cover); //2.4绘制封面图片 g.DrawImage(water, //水印图片 new Rectangle(Cover.Width - water.Width, Cover.Height - water.Height, water.Width, water.Height), 0, //横向偏移 0, //纵向偏移 water.Width, //绘制宽度 water.Height, //绘制高度 GraphicsUnit.Pixel);//画笔大小 //2.5 释放画布,水印 g.Dispose(); water.Dispose(); } else//如果图片不存在,使用默认图片 { //2.6 设置默认页面为封面图片 Cover = Image.FromFile(defaultPath); } //3 设置输出内容类型 context.Response.ContentType = "image/jpeg"; //4 将修改的图片保存到文件流中 Cover.Save(context.Response.OutputStream, //要保存到的文件输出流 System.Drawing.Imaging.ImageFormat.Jpeg); //保存文件类型 //5. 释放图片 Cover.Dispose(); context.Response.End(); } } //注意事项: //1.配置配置文件,以捕获图片的访问请求 //2.CoverHandler.cs要在网站中创建类,并按提示保存在App_Code文件夹下,不可使用"一般处理程序"; //3.实现IHttpHandler接口的方法; //4. 设置不能允许重用; //5. 编写最终处理程序
3.在aspx页面无需任何处理,当请求为image/*.jpg的时候就转到MyBookMark这个Handler中处理了,同样也输出带水印的图片 。