封面数字水印

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



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值