HttpHandle数字水印

动态地添加数字水印效果,要用到HttpHandle技术。

ASP.NET请求处理过程是基于管道模型的,这个管道模型由多个HttpModule和HttpHandler组成,ASP.NET把HTTP请求依次传递给管道中的各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中干预请求的处理过程。

  • 事实上我们每请求一个aspx页面都经历了同样的过程,只不过我们没有察觉而已。
  • 一个请求可以经过多个Module但是最终只能被一个Handler处理。

HttpHandler的使用

在“添加新项”中添加“一般处理程序”,如图所示。

单击“添加”按钮后,创建一个以.aspx为后缀名的文件。默认创建的内容为:

[csharp]  view plain  copy
[csharp]  view plain  copy
  1. public class Handler1 : IHttpHandler //实现IHttpHandler接口
  2. {
  3. public void ProcessRequest(HttpContext context)
  4. {//实现ProcessRequest方法
  5. context.Response.ContentType = "text/plain";
  6. context.Response.Write("Hello World");
  7. }
  8. public bool IsReusable //实现IsReusable属性
  9. {
  10. get
  11. {
  12. return false;
  13. }
  14. }
  15. }

数字水印的实现

  • 直接编辑每张图片(需要大量的人力)
  • 编辑实现批量编辑图片(节省人力,效果高,但原始图片丢失)
  • 在显示图片时,动态添加数字水印效果  (使用HttpHandler)

1、使用Handler方式实现数字水印

[csharp]  view plain  copy
  1. public class PicHandler : IHttpHandler
  2. {
  3. //普通图片的虚拟路径
  4. private const string IMG = "~/productimgs/";
  5. //默认图片的虚拟路径
  6. private string defaultimg = "~/productimgs/default.jpg";
  7. //处理方法
  8. public void ProcessRequest(HttpContext context)
  9. {
  10. //定义新的图片
  11. Image Cover;
  12. //获取图片物理路径
  13. string path = context.Request.MapPath(IMG + context.Request.Params["id"].ToString() + ".jpg");
  14. //判断图片的物理路径是否存在
  15. if (File.Exists(path))
  16. {
  17. //加载图片
  18. Cover = Image.FromFile(path);
  19. //定义字体
  20. Font font = new Font("微软雅黑", 20);
  21. //定义画布
  22. Graphics g = Graphics.FromImage(Cover);
  23. //合成水印图片
  24. g.DrawString("xiecan.cc", font, Brushes.Red, Cover.Width - 90, Cover.Height - 30);
  25. //释放画布
  26. g.Dispose();
  27. }
  28. else
  29. {
  30. //加载默认图片
  31. Cover = Image.FromFile(context.Request.MapPath(defaultimg));
  32. }
  33. //定义输出类型
  34. context.Response.ContentType = "image/jpeg";
  35. //保存图片到输出流
  36. Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
  37. //释放画布
  38. Cover.Dispose();
  39. //输出结束
  40. context.Response.End();
  41. }
  42. //是否重用
  43. public bool IsReusable
  44. {
  45. get
  46. {
  47. return false;
  48. }
  49. }
  50. }

2、全局Handler方式实现数字水印

使用.aspx方式,需要修改所有访问封面图片的路径,太麻烦,能否在不修改任何访问路径的情况下实现图片的数字水印效果?

实现思路分析

  • 修改配置信息,将所有对.JPG内容的访问转到HttpHandler处理程序
  • 获得访问请求,得到用户访问的图片路径;
  • 根据请求的路径,查找相对应的DVD封面图片;
  • 将网站 标识“绘制”在DVD封面图片的左下角;
  • 修改程序的输出类型,并将组合出的新图片输出。

配置全局Handler

[csharp]  view plain  copy
  1. <httpHandlers>
  2. <remove verb="*" path="*.asmx"/>
  3. <add verb="*" path="ProductImgs/*.jpg" type="第2章_用户控件与HttpHandler.PicCoverHandler"/>
  4. <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  5. <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"/>
  6. <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"/>
  7. </httpHandlers>
  • verb:谓词GET、POST、FTP等。
  • path:访问路径,此处表示所有针对“Productlmgs/*.jpg”路径的请求都将交给PicCoverHandler类进行处理。
  • type:指定的处理程序(类)。

URL路径: path="ProductImgs/*.jpg"

指定类名,新建的类:type="第2章_用户控件与HttpHandler.PicCoverHandler"

实现数字水印

[csharp]  view plain  copy
  1. public class PicCoverHandler : IHttpHandler
  2. {
  3. //默认图片
  4. private string defaultimg = "~/productimgs/default.jpg";
  5. public bool IsReusable
  6. {
  7. get { throw new NotImplementedException(); }
  8. }
  9. public void ProcessRequest(HttpContext context)
  10. {
  11. //实例化图片
  12. Image Cover;
  13. //判断图片物理路径是否存在
  14. if (File.Exists(context.Request.PhysicalPath))
  15. {
  16. //加载图片
  17. Cover = Image.FromFile(context.Request.PhysicalPath);
  18. //定义字体
  19. Font font = new Font("微软雅黑", 20);
  20. //定义画布
  21. Graphics g = Graphics.FromImage(Cover);
  22. //合成水印图片
  23. g.DrawString("xiecan.cc", font, Brushes.Black, Cover.Width - 90, Cover.Height - 30);
  24. //释放画布
  25. g.Dispose();
  26. }
  27. else
  28. {
  29. Cover = Image.FromFile(context.Request.MapPath(defaultimg));
  30. }
  31. //定义输出类型
  32. context.Response.ContentType = "image/jpeg";
  33. //保存图片到输出流
  34. Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
  35. //释放图片
  36. Cover.Dispose();
  37. //终止输出
  38. context.Response.End();
  39. }
  40. }

在IIS配置处理程序

在IIS上使用该方式要做其他处理

  • 开发服务器仅提供最简单的Web服务器功能,它不对请求的内容做任何处理,而是直接 将所有的请求装交给ASP.NET处理。
  • IIS功能比较完善,可以独立处理一些访问请求,比如.html、.jpg等的访问不会提交给 ASP.NET来处理

ASP.NET HttpHandle数字水印相关推荐

  1. 虚拟主机上用Asp.net实现Urlrewrite

    在网上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandle+Server.Transfer的方法.其实这种方法是错误的.第一,HttpHandle是实现不了urlrewr ...

  2. Asp.Net页面执行流程分析

    在我的上一篇文章中说到了HttpModule.HttpHandle的简单使用,我们可以利用它们在页面请求的过程中加入自己的事件处理程序.那么在一个aspx页面请求时后台到底做了什么?当然asp.net ...

  3. ASP.NET的SEO:使用.ashx文件——排除重复内容

    本系列目录 不同的链接指向的页面如果具有大量相同的内容,这种现象就会被称为"重复内容",如果一个网站的重复内容很多,搜索引擎就会认为这个网站的价值不高.所以我们应尽量避免各种重复内 ...

  4. Asp.net(C#)面试100+题陆续添加中……

    我收集的面试题以及自己对一些面试题的理解: 1.C#不支持多重继承,可以通过接口实现. 2.public 全部公开     private 类内部     protected 自己和自己的子类     ...

  5. Asp.net中的web.config配置

    Asp.net中的web.config配置 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 ...

  6. 使用ASP.NET 2.0提供的WebResource管理资源

    在 ASP.net 2.0 构建的Web页面中,查看源文件,我们经常会看到下面的Html文本 <script src="/WebResource.axd?d=QfRKDnWw93T08 ...

  7. asp.net 页面全生命周期

    .Net 托管代码和非托管代码的区别 后台代码隐藏/显示前台控件 .Net 页面生命周期 2012-03-21 13:31:08|  分类: .NET |  标签:.net  页面生命周期  c#  ...

  8. 微软项目技术结构思路 ExtJs/JQuery + Asp.net MVC + Wcf service + Entity Framework

    正文: 这一阵子在做一个项目, 客户要求使用ExtJs/ vs2008 sql server 2005, 也是好长时间没有去看新的技术和一些框架; 初步设计是准备使用 ExtJs + HTTPHand ...

  9. asp.net 页面静态化

    页面静态化,有三种方式 伪静态  真静态,折中法  现在我做的是折中发 创建一个asp.net  页面,  连接跳转到还未生成的页面 创建HttpHandle类 using System; using ...

最新文章

  1. java 枚举 下拉框_枚举enum在velocity模板语言中的应用-下拉菜单
  2. JAVA——实现七牛云对象存储Region对象采用配置方式生成解决方案
  3. Cassandra Dev 1: Cassandra 入门
  4. iOS 字典与字符串之间的互转
  5. linux 复制文件 中文,linux中cp命令如何复制文件
  6. Paw 百度ai_直面落地!百度EasyDL产业智能创新大赛成果覆盖能源、交通、水利民生重业...
  7. wpsa3版面怎么变成a4、排版不变_毕业论文排版攻略
  8. shell 字符截取
  9. Docker-CE 入门
  10. Data-mediator入门系列2
  11. android 发送显示广播,如何查看Android系统当前发送了什么广播
  12. 2021-08-08备份数据库
  13. 实时数仓入门训练营:Hologres 数据导入/导出实践
  14. Enterprise Architect安装包及教程
  15. 谷歌浏览器部分iframe页面无法打开,跨域问题
  16. 【MYSQL】误删数据恢复流程说明
  17. C++17标准STL库并行策略在GCC编译器中的替代实现方法
  18. Python开发qq批量登陆
  19. 2017/11/6~2017/11/12学习Java总结
  20. 按住iPhone按钮时如何阻止Siri打开

热门文章

  1. 放弃FastDFS,拥抱MinIO的7大理由
  2. 语聊房高质量音乐伴奏的实现
  3. 32位PowerPC常用指令集总结
  4. maven(一) maven到底是个啥玩意~
  5. Maven学习笔记-什么是maven?
  6. MySQL模糊查询详解
  7. 内心紧张,难成大事!5个方法学会驾驭自己,做事业自然气定神闲
  8. 骨传导耳机打电话怎么样?适合打电话的蓝牙耳机
  9. 动态代理和静态代理各自的特点
  10. 深度学习 Deep Learning