using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Drawing;
/// <summary>
///CoverHandler 的摘要说明
/// </summary>
public class CoverHandler : IHttpHandler
{
public CoverHandler()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 水印图片
/// </summary>
private const string SY = "~/Images/WaterMark.jpg";
/// <summary>
/// 默认图片
/// </summary>
private const string MR = "~/Images/default.jpg";
public void ProcessRequest(HttpContext context)
{
System.Drawing.Image Cover;
if (File.Exists(context.Request.PhysicalPath))
{
/*实际图片*/
Cover = Image.FromFile(context.Request.PhysicalPath);
/*水印图片*/
Image sy = Image.FromFile(context.Request.MapPath(SY));
/*画布*/
Graphics g = Graphics.FromImage(Cover);
/*在实际图片Cover上绘制水印*/
/*参数:1.水印图片,2.水印所在的位置和大小,3.从水印的宽度剪切掉,4.cong水印的高度上剪切掉,5水印的宽度,6.水印的高度7.单位*/
g.DrawImage(sy, new Rectangle(Cover.Width - sy.Width, Cover.Height - sy.Height, sy.Width, sy.Height), 0, 0, sy.Width, sy.Height, GraphicsUnit.Pixel);
/*在图片上加文字水印
g.DrawString("第三波", new Font("楷体", 24), new SolidBrush(Color.FromArgb(0, 0, 0)), new PointF(0, 0));
*/
g.Dispose();
sy.Dispose();
}
else
{
Cover = Image.FromFile(context.Request.MapPath(MR));
}
/*设置输出格式*/
context.Request.ContentType = "image/jpeg";
/*将图片存入输出流*/
Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
Cover.Dispose();
context.Response.End();
}
public bool IsReusable
{
get { throw new NotImplementedException(); }
}
}
/*说明*/
/*要捕捉图片的访问请求,做一些配置.在web.config中添加如下代码:
<system.web>
<httpHandlers>
<add verb="*" path="Images/BookCovers/*.jpg" type="CoverHandler"/>
</httpHandlers>
</system.web>
这样访问图片就可以显示.
verfb:代表谓词(比如GET ,POST ,FTP 等)列表,又称动词列表.可以写作"GET,POST"."*"为通配符,所有请求.
path:访问路径,此处表示所有访问"Images/BookCovers/*.jpg"的路径的请求都交给CoverHandler类进行处理.
"*"为通配符,所以访问"Images/BookCovers"目录下的所有jpg文件都转交给CoverHandler类进行处理.
使用该配置后,不管请求路径中有没有实际文件,都将执行CoerHandler类.
type:指定逗号分割的类/程序集组合.ASP.NET首先在应用程序的专用\Bin目录中搜索程序集DLL,然后在系统程序集缓存中搜索.
CoverHandler类在网站下的App_Code目录下.
使用后:水印将在原圆片的右下角.
但可以修改"g.DrawImage()",里的new Rectangle( 0, 0, sy.Width, sy.Height)参数来修改水印的位置.
Rectangle里的第一个参数是水印的起始位置在原图片的x位置,第二个参数为在水印在原图片的y位置.
第三和第四是水印的宽和高.*/