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();
}
}
在IIS配置处理程序
在IIS上使用该方式要做其他处理
- 开发服务器仅提供最简单的Web服务器功能,它不对请求的内容做任何处理,而是直接 将所有的请求装交给ASP.NET处理。
- IIS功能比较完善,可以独立处理一些访问请求,比如.html、.jpg等的访问不会提交给 ASP.NET来处理