动态添加水印功能同样需要增加自定义的实现IHttpHandle的类(WaterMarkHandlers),并在webconfig的根节点下增加一个<locaion>节点。
<location path="images"> <system.web> <httpHandlers> <!--对images文件夹下的所有jpg文件添加水印--> <add verb="*" path="*.jpg" type="WaterMarkHandler"/> <add verb="*" path="*.bmp" type="WaterMarkHandler"/> </httpHandlers> </system.web> </location>
using System;using System.Web;using System.Drawing;using System.Drawing.Imaging;using System.IO;
/// <summary>/// 动态给图片添加水印的类/// </summary>public class WaterMarkHandler : IHttpHandler{ public WaterMarkHandler() {
}
#region IHttpHandler 成员 /// <summary> /// 指示其它请求是否可以使用这个实例,如果是true,则放入池中接受其它请求以提高请求 /// </summary> public bool IsReusable { get { return true; } } /// <summary> /// 处理请求 /// </summary> /// <param name="context">当前HTTP请求的上下文</param> public void ProcessRequest(HttpContext context) { //获取请求的物理图片路径 string imagePath = context.Request.PhysicalPath; Image image = null; if (File.Exists(imagePath)) { //定义水印文字 string text = "图片来自励志工作室"; //定义水印文字字体大小 int fontSize = 3; //水印文字字体 Font font = new Font("宋体", fontSize); //根据图片物理地址加载图片 image = Image.FromFile(imagePath); Graphics g = Graphics.FromImage(image); //获取要绘制水印文字所需要的显示区域大小 SizeF size = g.MeasureString(text, font); if (size.Width > image.Width || size.Height > image.Height) { //如果要显示的图片的尺寸都不足以显示按照指定字体来添加水印 //可以减小字体大小或者不添加水印(太小了没办法添加嘛) } else//添加水印文字 { Brush brush = Brushes.Red; //在图片上添加水印,绘制水印文字在图片的右下角 g.DrawString(text, font, brush, image.Width - size.Width, image.Height - size.Height); g.Dispose(); } } else//如果不存在,指定一个默认图片进行显示 { imagePath = context.Server.MapPath("~/images/nopic.jpg"); image = Image.FromFile(imagePath); } image.Save(context.Response.OutputStream, ImageFormat.Jpeg);//将添加水印的图片输入到当前流中 }
#endregion}