使用一般处理程序(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. 编写最终处理程序
时间: 2024-08-10 17:12:14

使用一般处理程序(IHttpHandler)制作图片水印的相关文章

java制作图片水印

1.创建缓存图片对象 2.创建Java绘图工具对象 3.将原图绘制到缓存图片对象 4.使用工具将水印绘制到缓存图片对象 5.创建图片编码工具类 6.输出缓存图片对象到目标图片文件 BufferedImage Graphics2D JPEGImageEncoder

webform:图片水印、验证码制作

一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID="Button1" runat="server" Text="上传" /><br /> <asp:Image ID="Image1&

Thinkphp图片水印和文字水印

1.Thinkphp图像处理 在TP框架中,我们经常用到图片上传,我最近写了很多关于图片上传的文章,thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成等文章,今天写一下关于图片上传成功后给图片加水印文字或者加图片水印, 1.1图片处理类和库 首先,在Thinkphp\Think\Image类中有图像处理功能,支持Gd库和Imagick库,包括对GIf图像处理的支持. 1.2实例化类库 $image = new \Think\Image(); 实例化image后,默认使用

iOS UI进阶-1.1 Quartz2D 图片水印/裁剪/截图

图片水印 UIImage+MJ.h #import <UIKit/UIKit.h> @interface UIImage (MJ) /** * 打水印 * * @param bg 背景图片 * @param logo 右下角的水印图片 */ + (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo; @end UIImage+MJ.m #import "UIImage+MJ.h" @imple

iOS UIImage 图片水印,图片裁剪,屏幕截图,背景平铺

图片水印功能 1 #import "UIImage+ZR.h" 2 3 @implementation UIImage (ZR) 4 + (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo 5 { 6 UIImage *bgImage = [UIImage imageNamed:bg]; 7 8 // 1.创建一个基于位图的上下文(开启一个基于位图的上下文) 9 UIGraphicsBeginImage

图片水印技术实践

/// <summary> /// 图片位置 /// </summary> public enum ImagePosition { LeftTop, //左上 LeftBottom, //左下 RightTop, //右上 RigthBottom, //右下 TopMiddle, //顶部居中 BottomMiddle, //底部居中 Center //中心 } /// <summary> /// 水印图片的操作管理 Design by Gary Gong From D

ASP.NET(C#)图片加文字、图片水印,神啊,看看吧

ASP.NET(C#)图片加文字.图片水印 一.图片上加文字: //using System.Drawing; //using System.IO; //using System.Drawing.Imaging; private void AddTextToImg(string fileName,string text) { if(!File.Exists(MapPath(fileName))) { throw new FileNotFoundException("The file don't

图片水印和图片验证码

两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID="Button1" runat="server" Text="上传" /><br /> &

使用lowagie给pdf添加文字和图片水印

package com.xian.util; import java.awt.Color;import java.io.FileOutputStream;import java.io.IOException; import com.lowagie.text.DocumentException;import com.lowagie.text.Element;import com.lowagie.text.Image;import com.lowagie.text.pdf.BaseFont;impo