做网站的时候经常需要将图片加上网站名称的水印。这样做可以使别人转载图片的时候出现图片出处 ,利于网站宣传。但是如果利用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), , , 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),
, //横向偏移
, //纵向偏移
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中处理了,同样也输出带水印的图片 。

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

  1. java制作图片水印

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

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

    一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat=& ...

  3. webform(十)——图片水印和图片验证码

    两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID=&q ...

  4. PDF怎么添加文字水印与图片水印

    现在是个知识分享时代,但不可避免的盗版也无处不在,不知道在我们大家身边有没有遇到过这样的情况:自己煞费苦心制作的PDF文档不知道在什么时候就会被别人给盗用了,那么如何才能尽量避免这个问题呢?今天带大家 ...

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

    图片水印 UIImage+MJ.h #import <UIKit/UIKit.h> @interface UIImage (MJ) /** * 打水印 * * @param bg 背景图片 ...

  6. Thinkphp图片水印和文字水印

    1.Thinkphp图像处理 在TP框架中,我们经常用到图片上传,我最近写了很多关于图片上传的文章,thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成等文章,今天写一下关于图 ...

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

    ASP.NET(C#)图片加文字.图片水印 一.图片上加文字: //using System.Drawing; //using System.IO; //using System.Drawing.Im ...

  8. PHP图片加文字水印和图片水印方法(鉴于李老师博客因没加水印被盗,特搜集的办法。希望能有用!)

    $dst_path = 'dst.jpg'; //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path)); //打上文字 ...

  9. IOS第17天(1,Quartz2D图片水印)

    ****图片 水印 #import "HMViewController.h" @interface HMViewController () @property (weak, non ...

随机推荐

  1. 1019 General Palindromic Number (20 分)

    1019 General Palindromic Number (20 分) A number that will be the same when it is written forwards or ...

  2. ROS的工作模式和ESXI网卡工作模式的关系

    1.ROS网卡如果工作在桥接模式,那么ESXI网卡的工作模式必须设置为Promiscuous Mode(混杂模式)和Forged Transmits(伪传输)这两个必须都为开启状态,如下: 这种情况, ...

  3. Vue 路由配置、动态路由

    1.安装 npm install vue-router --save / cnpm install vue-router --save 2.引入并 Vue.use(VueRouter) (main.j ...

  4. HTC Vive前置摄像头API(未测试)

    /*WebCamTexture:网络摄像头材质 WebCamTexture.Play() 播放: WebCamTexture.Pause() 暂停: WebCamTexture.Stop() 停止:* ...

  5. centos 7.x设置守护进程的文件数量限制

    在Bash中有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 1. 系统级设置 1.1 C ...

  6. bitmap运算

    概述 所谓bitmap就是用一个bit位来标记某个元素对应的value,而key即是这个元素.由于采用bit为单位来存储数据,因此在可以大大的节省存储空间     算法思想 32位机器上,一个整形,比 ...

  7. Spark数据本地性

    1.文件系统本地性 第一次运行时数据不在内存中,需要从HDFS上取,任务最好运行在数据所在的节点上: 2.内存本地性 第二次运行,数据已经在内存中,所有任务最好运行在该数据所在内存的节点上: 3.LR ...

  8. GO ‘N’ Times,SQL执行同一个语句多次

    GO (Transact-SQL)   语法   GO [count] 参数 count 为一个正整数. GO 之前的批处理将执行指定的次数.   源文档 <http://msdn.micros ...

  9. 理解无偏估计(unbiased estimation)

    判断一个估计量“好坏”,至少可以从以下三个方面来考虑: 无偏估计 有效性 一致性 参考内容: 如何理解无偏估计量?https://www.matongxue.com/madocs/808.html 衡 ...

  10. spring security 表单认证的流程

    spring security表单认证过程 表单认证过程 Spring security的表单认证过程是由org.springframework.security.web.authentication ...