添加数字水印的好处:能够很好地保护著作权,防止他人盗用受保护的资源。
添加数字水印有两种方法:一种是指定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;
}
}
}