主要内容
使用IHttpHandler实现水印效果
动态添加数字水印效果
1. 创建一个 一般处理程序(.ashx)格式的文件
它的contex参数对象基本是个万能对象了,需要调用的Server对象,Request对象等都是通过点出来的。
在此文件中,就初级来说,目前我知道的就是老师的这些,主要处理的一个方法就是从IHttpHandler接口继承过来的:
public void ProcessRequest(HttpContext context)方法。
在这个方法中,如果要使用asp.net对象的话,需要用参数context来引用。
2. 获取要处理的图片
如何开始Handler1.ashx的功能呢?
先把图片传过来:
创建一个方法,在这个方法中,将图片名字做一个参数,在页面加载时,通过get方法传递到"Handler1.ashx?isbnImage="+图片名。再由Handler1.ashx这个处理程序对图片进行处理。如下代码:
//获取图片名称,以连接的方式发送到.ashx处理程序中,这里Handler1.ashx就相当于一个页面
public string GetUrl(string isbn)
{
return "Handler1.ashx?isbnImage=" + isbn;
}
在前端:由原来的:<%#Eval("isbn","~/images/{0}.jpg") %>
改写成:<%# GetUrl(Eval("isbn").ToString()) %>
3. 使用System.IO;这个类库中的File.Exists()方法来判断这个文件是否存在。方法的参数必须是个文件路径,且是绝对路径。
4. context.Server.MapPath()方法映射文件路径,即将一个虚拟路径转换成绝对路径。
5. 加载一个图片Image image=Image.FromFile(图片路径);
Image这个类是存储在system.Drawing命名空间中的
为什么要使用这个类?
因为两个图片(被贴的源图片和水印图片)都是存储在物理磁盘上的,如果要对它们进行操作,则需要加载到内存当中来进行
6. 贴水印前的绘制图片
Graphics g =Graphics.FromImage(image);//先绘制源图片
g.DrawImage();//在源图片上绘制水印图片上去,它有多个参数
DrawImage()这方法的作用是,在指定的位置指定区域内绘制
参数1是Image对象
参数2是Rectangle矩形对象,矩形对象的绘制有4个参数,x方向的位置,y方向的位置,宽度和高度。这里的位置是相对于源图片的左上角的。
如实现源代码:
public void ProcessRequest(HttpContext context)
{
//将默认显示的图片和水印图片的路径定义好
string defaults="~image/default.jpg";
string waterMark="~/images/waterMark.jpg";
//水印效果的实现
Image image;
string isbn = context.Server.MapPath("~images/" + context.Request.QueryString["isbnImage"].ToString() + ".jpg");//将文件的虚拟路径转换成绝对路径
//判断文件是否存在(这是物理路径下的文件是否存在)
if (File.Exists(isbn))
{
//如果此文件在路径下的文件夹中存在则为true,就可以为这个图片贴水印了
//因为被贴水印的源图片和水印图片存储在物理磁盘上,所以要先将它加载到内存中
image = Image.FromFile(isbn);
Image waterMarkImage = Image.FromFile(context.Server.MapPath(waterMark));
//绘制图片
Graphics g = Graphics.FromImage(image);//绘制被贴水印的源图片
g.DrawImage(waterMarkImage, new Rectangle(image.Width - waterMarkImage.Width, image.Height - waterMarkImage.Height, waterMarkImage.Width, waterMarkImage.Height));
//接下来别忘记释放内存,绘图工具,内存对象image,waterMarkImage
g.Dispose();
waterMarkImage.Dispose();
//image.Dispose();//这里因为还有个否定条件要用到,先不释放
}
else {
//如果此文件在路径下的文件夹中存在不存在则为false, 否则就使用默认的图片
image = Image.FromFile(context.Server.MapPath(defaults));
}
//最后要保存贴好水印的图片,save方法:一个二进制输出流到HTTP,一个是输入的文件格式
image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
//这里image对象就用完了,收工,释放内存资源
image.Dispose();
}
使用IHttpHandler实现水印效果
动态添加数字水印效果
1. 创建一个 一般处理程序(.ashx)格式的文件
它的contex参数对象基本是个万能对象了,需要调用的Server对象,Request对象等都是通过点出来的。
在此文件中,就初级来说,目前我知道的就是老师的这些,主要处理的一个方法就是从IHttpHandler接口继承过来的:
public void ProcessRequest(HttpContext context)方法。
在这个方法中,如果要使用asp.net对象的话,需要用参数context来引用。
2. 获取要处理的图片
如何开始Handler1.ashx的功能呢?
先把图片传过来:
创建一个方法,在这个方法中,将图片名字做一个参数,在页面加载时,通过get方法传递到"Handler1.ashx?isbnImage="+图片名。再由Handler1.ashx这个处理程序对图片进行处理。如下代码:
//获取图片名称,以连接的方式发送到.ashx处理程序中,这里Handler1.ashx就相当于一个页面
public string GetUrl(string isbn)
{
return "Handler1.ashx?isbnImage=" + isbn;
}
在前端:由原来的:<%#Eval("isbn","~/images/{0}.jpg") %>
改写成:<%# GetUrl(Eval("isbn").ToString()) %>
3. 使用System.IO;这个类库中的File.Exists()方法来判断这个文件是否存在。方法的参数必须是个文件路径,且是绝对路径。
4. context.Server.MapPath()方法映射文件路径,即将一个虚拟路径转换成绝对路径。
5. 加载一个图片Image image=Image.FromFile(图片路径);
Image这个类是存储在system.Drawing命名空间中的
为什么要使用这个类?
因为两个图片(被贴的源图片和水印图片)都是存储在物理磁盘上的,如果要对它们进行操作,则需要加载到内存当中来进行
6. 贴水印前的绘制图片
Graphics g =Graphics.FromImage(image);//先绘制源图片
g.DrawImage();//在源图片上绘制水印图片上去,它有多个参数
DrawImage()这方法的作用是,在指定的位置指定区域内绘制
参数1是Image对象
参数2是Rectangle矩形对象,矩形对象的绘制有4个参数,x方向的位置,y方向的位置,宽度和高度。这里的位置是相对于源图片的左上角的。
如实现源代码:
public void ProcessRequest(HttpContext context)
{
//将默认显示的图片和水印图片的路径定义好
string defaults="~image/default.jpg";
string waterMark="~/images/waterMark.jpg";
//水印效果的实现
Image image;
string isbn = context.Server.MapPath("~images/" + context.Request.QueryString["isbnImage"].ToString() + ".jpg");//将文件的虚拟路径转换成绝对路径
//判断文件是否存在(这是物理路径下的文件是否存在)
if (File.Exists(isbn))
{
//如果此文件在路径下的文件夹中存在则为true,就可以为这个图片贴水印了
//因为被贴水印的源图片和水印图片存储在物理磁盘上,所以要先将它加载到内存中
image = Image.FromFile(isbn);
Image waterMarkImage = Image.FromFile(context.Server.MapPath(waterMark));
//绘制图片
Graphics g = Graphics.FromImage(image);//绘制被贴水印的源图片
g.DrawImage(waterMarkImage, new Rectangle(image.Width - waterMarkImage.Width, image.Height - waterMarkImage.Height, waterMarkImage.Width, waterMarkImage.Height));
//接下来别忘记释放内存,绘图工具,内存对象image,waterMarkImage
g.Dispose();
waterMarkImage.Dispose();
//image.Dispose();//这里因为还有个否定条件要用到,先不释放
}
else {
//如果此文件在路径下的文件夹中存在不存在则为false, 否则就使用默认的图片
image = Image.FromFile(context.Server.MapPath(defaults));
}
//最后要保存贴好水印的图片,save方法:一个二进制输出流到HTTP,一个是输入的文件格式
image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
//这里image对象就用完了,收工,释放内存资源
image.Dispose();
}