zoukankan      html  css  js  c++  java
  • 使用一般处理程序(IHttpHandler)制作图片水印

    做网站的时候经常需要将图片加上网站名称的水印。这样做可以使别人转载图片的时候出现图片出处 ,利于网站宣传。但是如果利用ps来一个一个加水印工作量非常浩大,而且修改了之后就没法还原。这 篇教程教大家利用一般处理程序(Handler)制作图片水印,这种水印的优点是一经修改全站适用,而且不改变原来的图片。

    制作水印分为两种方法,一种是利用局部Handler,给指定路径的图片添加水印;另一种是利用全局Handler。前者可以灵活的选择指定的图片添加水印,但是不方便的是每次做链接的时候都要 加入Handler地址,不利于整体修改。而后者是指定文件夹里的图片都加水印。

    一、局部Handler:

    1.添加一般处理程序WaterMarkHandler.ashx。

    <%@ WebHandler Language="C#" Class="WaterMarkHandler" %>
     
    using System;
    using System.Web;
    using System.IO;
    using System.Drawing;
     
    public class WaterMarkHandler : IHttpHandler {
        string waterPath = "~/images/1/WaterMark.png";//水印图片路径
        string defaultPath = "~/images/1/default.jpg";//默认图片路径
       
        public void ProcessRequest (HttpContext context) {
            string coverPath =context.Server.MapPath(context.Request.Params["path"]);
            Image cover;
            if (File.Exists(coverPath))
            {
                //加载图片
                cover = Image.FromFile(coverPath);
                //加载水印图片
                Image water = Image.FromFile(context.Request.MapPath(waterPath));
                //实例化画布
                Graphics g = Graphics.FromImage(cover);
                //绘制图片
                g.DrawImage(water, new Rectangle(cover.Width - water.Width, cover.Height - water.Height, water.Width, water.Height), 0, 0,   water.Width,water.Height,GraphicsUnit.Pixel);
                //释放画布
                g.Dispose();
                //释放水印
                water.Dispose();
            }
            else//没有图片,显示默认图片
            {
                cover = Image.FromFile(context.Request.MapPath(defaultPath));
            }
            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.在aspx页面中调用HttpHandler:

    <img src="WaterMarkHandler.ashx?path=images/9787115161321.jpg" />

    这样当Image控件访问Handler的时候就可以输出图片了。

    二、全局Handler:

    这个方法不需要创建HttpHandler.ashx,只需要在App_Code文件夹里面创建一个类即可,然后在配置文件中指定这个类,而在aspx访问图片的页面不需要任何改变:

    1.配置Web.config:

        <system.web>
            <compilation debug="true" targetFramework="4.0" />
            <httpHandlers>
                <add verb="*" path="images/*.jpg" type="WaterMarkHandler" />
            </httpHandlers>
        </system.web>

    2.全局Handler WaterMarkHandler的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Drawing;
    using System.IO;
     
    /// <summary>
    ///CoverHandler 的摘要说明
    ///1.配置配置文件,以捕获图片的访问请求
    ///2.创建类文件CoverHandler.cs
    ///3.实现IHttpHandler接口的方法
    /// </summary>
    public class WaterMarkHandler : IHttpHandler
    {
        public WaterMarkHandler()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }
        //4. 设置不能允许重用
        public bool IsReusable
        {
            get { return false; }
        }
        //5. 编写最终处理程序
        public void ProcessRequest(HttpContext context)
        {
            //1 获取封面图片,水印图片,默认图片的路径
            string coverPath = context.Request.PhysicalPath;
            string waterPath = context.Server.MapPath("~/images/1/default.jpg");//水印图片
            string defaultPath = context.Server.MapPath("~/images/1/default.jpg");//默认图片
     
            //2.绘制图片
            Image Cover;//定义封面图片对象
            if (File.Exists(coverPath))// **注意:根据物理路径进行判断文件是否存在**
            {
                //2.1 加载封面图片
                Cover = Image.FromFile(coverPath);
                //2.2 加载水印图片
                Image water = Image.FromFile(waterPath);
                //2.3实例化画布  **已封面图片作为画布**
                Graphics g = Graphics.FromImage(Cover);
                //2.4绘制封面图片
                g.DrawImage(water,              //水印图片
                            new Rectangle(Cover.Width - water.Width, Cover.Height - water.Height, water.Width, water.Height),
                            0,                  //横向偏移
                            0,                  //纵向偏移
                            water.Width,        //绘制宽度
                            water.Height,       //绘制高度
                            GraphicsUnit.Pixel);//画笔大小  
                //2.5 释放画布,水印
                g.Dispose();
                water.Dispose();
            }
            else//如果图片不存在,使用默认图片
            {
                //2.6 设置默认页面为封面图片
                Cover = Image.FromFile(defaultPath);
            }
            //3 设置输出内容类型
            context.Response.ContentType = "image/jpeg";
            //4 将修改的图片保存到文件流中
            Cover.Save(context.Response.OutputStream,               //要保存到的文件输出流
                        System.Drawing.Imaging.ImageFormat.Jpeg);   //保存文件类型
            //5. 释放图片
            Cover.Dispose();
            context.Response.End();
     
        }
    }
     
    //注意事项:
    //1.配置配置文件,以捕获图片的访问请求
    //2.CoverHandler.cs要在网站中创建类,并按提示保存在App_Code文件夹下,不可使用"一般处理程序";
    //3.实现IHttpHandler接口的方法;
    //4. 设置不能允许重用;
    //5. 编写最终处理程序

    3.在aspx页面无需任何处理,当请求为image/*.jpg的时候就转到MyBookMark这个Handler中处理了,同样也输出带水印的图片 。

  • 相关阅读:
    html标题-段落-字符实体-换行
    html概述和html基本结构:
    可以在一个.java文件中写两个类吗?
    栈内存和堆内存的区别
    Java的访问权限
    (转)第三方支付的盈利模式
    (转)第三方支付参与者
    直联和间联的区别——直连和间连的区别
    HashSet和LinkedHashSet特点.
    Map和TreeMap的特点
  • 原文地址:https://www.cnblogs.com/xyyt/p/3978812.html
Copyright © 2011-2022 走看看