这几天看了几篇关于IHttpHandler和IHttpModule的文章,对此深有感触,这些东西网上也有很多范例,我写出来的目的也是方做笔记,当然也是一种学习,同时也希望能帮助有需要的人。总的来说这2个东西的作用还是挺大的,在遇到一些问题比较难处理的时候,这2个东西的作用不可忽视。也不多说,直接上作品展示才是有力的武器。
一、首先建立一个类库
建立类库可以比较好的直接引用进自己的项目当中,在此类库中,创建一个类,ImageHttpHandler.cs,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.Drawing.Imaging; using System.IO; /// <summary> ///ImageHandler 的摘要说明 /// </summary> namespace CustomerHandler2 { public class ImageHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string imgurl = context.Request.PhysicalPath; if (File.Exists(imgurl)) { Bitmap img; if (context.Cache[imgurl] == null) { img = new Bitmap(imgurl); img = AddWaterMark(img); context.Cache[imgurl] = img; } else img = context.Cache[imgurl] as Bitmap; img.Save(context.Response.OutputStream, ImageFormat.Jpeg); } } public bool IsReusable { get { return true; } } /// <summary> /// 给图片添加水印 /// </summary> /// <param name="image"></param> /// <returns></returns> private Bitmap AddWaterMark(Bitmap image) { string text = System.Configuration.ConfigurationManager.AppSettings["WaterMark"].ToString(); int fontSize = int.Parse(System.Configuration.ConfigurationManager.AppSettings["FontSize"].ToString()); Font font = new Font("宋体", fontSize); Brush brush = Brushes.Red; Graphics g = Graphics.FromImage(image); SizeF size = g.MeasureString(text, font); g.DrawString(text, font, brush, image.Width - size.Width, image.Height - size.Height); g.Dispose(); return image; } } }
一一说明,首先判断是否有缓存,如果有的话就直接从缓存中取加水印的图片,没有的话就需要重新制作水印图片。img.Save(context.Response.OutputStream, ImageFormat.Jpeg);是把当前加水印的图片输出到当前响应流中。
上面要保证正确运行的话需要在自己项目中(不是类库,而是引用了当前类库的web项目中引用当前dll文件),配置如下:
<?xml version="1.0"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <appSettings> <add key="WaterMark" value="这是我的水印文字"/> <add key="FontSize" value="14"/> </appSettings> <system.web> <compilation debug="true" targetFramework="4.0"/> <httpHandlers> <add path="*.jpg" type="CustomerHandler2.ImageHandler,CustomerHandler2" verb="*"/> </httpHandlers> </system.web> </configuration>
上面有2点需要注意:
1、类库中 string text = System.Configuration.ConfigurationManager.AppSettings["WaterMark"].ToString();
int fontSize = int.Parse(System.Configuration.ConfigurationManager.AppSettings["FontSize"].ToString());
这2段是需要在web项目的web.config中进行配置的
2、 <httpHandlers>
<add path="*.jpg" type="CustomerHandler2.ImageHandler,CustomerHandler2" verb="*"/>
</httpHandlers>这个很重要,这个是注册该处理,path指明处理的对象是所有的jpg图片,当然也可以灵活配置(比如 某文件夹/*.jpg的图片等),type第一个是指明是dll+处理类,第二个是指明dll文件名,verb是说明get还是post等,*指明是所有的请求
最后在自己的web项目中随便引用一张图片就可以正确生成加水印图片了(此水印图片在实际文件夹中并没有加水印,只是在显示的时候添加了水印)