HttpHandle数字水印
动态地添加数字水印效果,要用到HttpHandle技术。
ASP.NET请求处理过程是基于管道模型的,这个管道模型由多个HttpModule和HttpHandler组成,ASP.NET把HTTP请求依次传递给管道中的各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中干预请求的处理过程。
- 事实上我们每请求一个aspx页面都经历了同样的过程,只不过我们没有察觉而已。
- 一个请求可以经过多个Module但是最终只能被一个Handler处理。
HttpHandler的使用
在“添加新项”中添加“一般处理程序”,如图所示。
单击“添加”按钮后,创建一个以.aspx为后缀名的文件。默认创建的内容为:
- public class Handler1 : IHttpHandler //实现IHttpHandler接口
- {
- public void ProcessRequest(HttpContext context)
- {//实现ProcessRequest方法
- context.Response.ContentType = "text/plain";
- context.Response.Write("Hello World");
- }
- public bool IsReusable //实现IsReusable属性
- {
- get
- {
- return false;
- }
- }
- }
数字水印的实现
- 直接编辑每张图片(需要大量的人力)
- 编辑实现批量编辑图片(节省人力,效果高,但原始图片丢失)
- 在显示图片时,动态添加数字水印效果 (使用HttpHandler)
1、使用Handler方式实现数字水印
- public class PicHandler : IHttpHandler
- {
- //普通图片的虚拟路径
- private const string IMG = "~/productimgs/";
- //默认图片的虚拟路径
- private string defaultimg = "~/productimgs/default.jpg";
- //处理方法
- public void ProcessRequest(HttpContext context)
- {
- //定义新的图片
- Image Cover;
- //获取图片物理路径
- string path = context.Request.MapPath(IMG + context.Request.Params["id"].ToString() + ".jpg");
- //判断图片的物理路径是否存在
- if (File.Exists(path))
- {
- //加载图片
- Cover = Image.FromFile(path);
- //定义字体
- Font font = new Font("微软雅黑", 20);
- //定义画布
- Graphics g = Graphics.FromImage(Cover);
- //合成水印图片
- g.DrawString("xiecan.cc", font, Brushes.Red, Cover.Width - 90, Cover.Height - 30);
- //释放画布
- g.Dispose();
- }
- else
- {
- //加载默认图片
- Cover = Image.FromFile(context.Request.MapPath(defaultimg));
- }
- //定义输出类型
- 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、全局Handler方式实现数字水印
使用.aspx方式,需要修改所有访问封面图片的路径,太麻烦,能否在不修改任何访问路径的情况下实现图片的数字水印效果?
实现思路分析
- 修改配置信息,将所有对.JPG内容的访问转到HttpHandler处理程序
- 获得访问请求,得到用户访问的图片路径;
- 根据请求的路径,查找相对应的DVD封面图片;
- 将网站 标识“绘制”在DVD封面图片的左下角;
- 修改程序的输出类型,并将组合出的新图片输出。
配置全局Handler
- <httpHandlers>
- <remove verb="*" path="*.asmx"/>
- <add verb="*" path="ProductImgs/*.jpg" type="第2章_用户控件与HttpHandler.PicCoverHandler"/>
- <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
- <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
- <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
- </httpHandlers>
- verb:谓词GET、POST、FTP等。
- path:访问路径,此处表示所有针对“Productlmgs/*.jpg”路径的请求都将交给PicCoverHandler类进行处理。
- type:指定的处理程序(类)。
URL路径: path="ProductImgs/*.jpg"
指定类名,新建的类:type="第2章_用户控件与HttpHandler.PicCoverHandler"
实现数字水印
- public class PicCoverHandler : IHttpHandler
- {
- //默认图片
- private string defaultimg = "~/productimgs/default.jpg";
- public bool IsReusable
- {
- get { throw new NotImplementedException(); }
- }
- public void ProcessRequest(HttpContext context)
- {
- //实例化图片
- Image Cover;
- //判断图片物理路径是否存在
- if (File.Exists(context.Request.PhysicalPath))
- {
- //加载图片
- Cover = Image.FromFile(context.Request.PhysicalPath);
- //定义字体
- Font font = new Font("微软雅黑", 20);
- //定义画布
- Graphics g = Graphics.FromImage(Cover);
- //合成水印图片
- g.DrawString("xiecan.cc", font, Brushes.Black, Cover.Width - 90, Cover.Height - 30);
- //释放画布
- g.Dispose();
- }
- else
- {
- Cover = Image.FromFile(context.Request.MapPath(defaultimg));
- }
- //定义输出类型
- context.Response.ContentType = "image/jpeg";
- //保存图片到输出流
- Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
- //释放图片
- Cover.Dispose();
- //终止输出
- context.Response.End();
- }
- }