封面数字水印

xiaoxiao2021-02-28  52

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来处理     

转载请注明原文地址: https://www.6miu.com/read-2622757.html

最新回复(0)