封面(图片)加数字水印

添加数字水印的好处:能够很好地保护著作权,防止他人盗用受保护的资源。


添加数字水印有两种方法:一种是指定Handler方式,另一种是全局Handler方式,一般使用全局Handler方式(此方式不要考虑图片路径问题)。


第一种:用指定Handler方式实现封面数字水印

<%@ WebHandler Language="C#" Class="BookImageHandler" %>

using System;
using System.Web;
//由于涉及到文件的IO操作和图片的绘制,所有需要引用using System.Drawing和using System.IO
using System.Drawing;
using System.IO;

/// <summary>
/// 用指定Handler方式实现封面数字水印
/// </summary>
public class BookImageHandler : IHttpHandler
{
    //1.原书籍图片的路径
    private const string OLDBOOKIMAGEURL = "~/Images/BookCovers/";
    
    //2.水印路径
    private const string WATERIMAGEURL = "~/Images/WaterMark.jpg";
    
    //3.默认图片路径
    private string DEFAULTIMAGEURL = "~/Images/default.jpg";
    
    public void ProcessRequest (HttpContext context)
    {
        //4.获取加载水印的书籍图片编号(Params[0]指地址栏传的第一个参数)
        string isbn = context.Request.Params[0].ToString();

        //组合图片路径
        string path = context.Request.MapPath(OLDBOOKIMAGEURL + isbn + ".jpg");

        Image oldImage;
        
        //File.Exists用于判断相应物理路径中的文件是否存在
        if (File.Exists(path))
        {
            //5.创建原图片对象
            oldImage = Image.FromFile(path);

            //6.加载水印图片对象
            Image waterImage = Image.FromFile(context.Request.MapPath(WATERIMAGEURL));

            //7.创建画布
            Graphics gpic = Graphics.FromImage(oldImage);

            //8.绘制水印
            gpic.DrawImage(waterImage, new Rectangle(oldImage.Width - waterImage.Width, oldImage.Height - waterImage.Height, waterImage.Width, waterImage.Height), 0, 0, waterImage.Width, waterImage.Height, GraphicsUnit.Pixel);
            //释放画布资源
            gpic.Dispose();
            //释放水印图片资源
            waterImage.Dispose();
        }
        else
        {
            //如果原图片不存在就使用默认图片
            oldImage = Image.FromFile(context.Request.MapPath(DEFAULTIMAGEURL));
        }
        
        //9.设置输出流类型
        context.Response.ContentType = "image/jpeg";
        
        //10.保存输出流
        oldImage.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
        
        //11.结束输出流
        oldImage.Dispose();
        context.Response.End();
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}


第二种:用全局Handler方式实现封面数字水印


第一步:修改配置文件,在web.config中添加如下代码。其中verb表示所谓请求“*”表示通配符,path表示访问路径,type表示指定的类名(程序集名)

将httpHandlers节点添加在system.web节点下

    <httpHandlers>
      <add verb="*" path="Images/BookCovers/*.jpg" type="BookImageHander"/>
    </httpHandlers>

第二步:创建类(编写处理代码),将此类创建在App_Code文件下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//由于涉及到文件的IO操作和图片的绘制,所有需要引用using System.Drawing和using System.IO
using System.Drawing;
using System.IO;

/// <summary>
///用全局Handler方式实现封面数字水印
/// </summary>
public class BookImageHander : IHttpHandler
{

    //1.水印图片路径
    public const string WATERIMAGEURL = "~/Images/WaterMark.jpg";

    //2.默认图片路径
    private string DEFAULTIMAGEURL = "~/Images/default.jpg";

    public void ProcessRequest(HttpContext context)
    {
        Image oldImage;

        //判断请求物理路径是否存在
        //PhysicalPath可用于获取HTTP请求所对应的物理路径
        if (File.Exists(context.Request.PhysicalPath))
        {
            //3.加载文件
            oldImage = Image.FromFile(context.Request.PhysicalPath);

            //4.加载水印图片对象
            Image waterImage = Image.FromFile(context.Request.MapPath(WATERIMAGEURL));

            //5.创建画布
            Graphics gpic = Graphics.FromImage(oldImage);

            //6.绘制水印(两种方法)
            //第一种,不容易理解
            //gpic.DrawImage(waterImage, new Rectangle(oldImage.Width - waterImage.Width, oldImage.Height - waterImage.Height, 
            //waterImage.Width, waterImage.Height), 0, 0, waterImage.Width, waterImage.Height, GraphicsUnit.Pixel);

            //第二种
            gpic.DrawImage(waterImage, new Point(oldImage.Width - waterImage.Width - 15, oldImage.Height - waterImage.Height - 15));
            //释放画布资源
            gpic.Dispose();
            //释放水印图片资源
            waterImage.Dispose();
        }
        else
        { 
            //如果原图片不存在就使用默认图片
            oldImage = Image.FromFile(context.Request.MapPath(DEFAULTIMAGEURL));
        }

        //7.设置输出流类型
        context.Response.ContentType = "image/jpeg";

        //8.保存输出流
        oldImage.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

        //9.结束输出流,释放资源
        oldImage.Dispose();
        context.Response.End();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值