Asp.net给图片加水印

来源:互联网 发布:mac输入法切换中文 编辑:程序博客网 时间:2024/04/29 23:38

一般网站水印的实现:
1)上传时就对图片加水印:
a) 每次用户访问时,直接给用户图片就行了.减小服务器端的压力.
b) 缺点:破坏了原有图片.如果网站换logo或改名
2)使用一般处理程序:
a) 每次用户请求都要进行水印的添加,增加了服务器端压力
b) 原图片被保存下来了.




使用一般处理程序的方法



在Web.Config配置文件中设置

<httpHandlers>
<add verb="*" path="/images/bookcovers/*.jpg" type="命名空间.类名" />
</httpHandlers>




verb表示所有的请求方式(get和post)
path代表请求网站那个目录下的文件要进行过滤
type表示要执行的一般处理程序的类名(命名空间.类名)







=================================================================================


一般处理程序代码参考
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


using System.Drawing;
using System.IO;


namespace BookShop.Web
{
    public class gwatermark : IHttpHandler
    {


        private const string WATERMARK_URL = "~/Images/watermark.jpg";        //水印图片
        private const string DEFAULTIMAGE_URL = "~/Images/default.jpg";  
        #region IHttpHandler 成员


        public bool IsReusable
        {
            get { return false; }
        }


        public void ProcessRequest(HttpContext context)
        {
            System.Drawing.Image Cover;
            //判断请求的物理路径中,是否存在文件
            if (File.Exists(context.Request.PhysicalPath))
            {
                //加载文件
                Cover = Image.FromFile(context.Request.PhysicalPath);
                //加载水印图片
                Image watermark = Image.FromFile(context.Request.MapPath(WATERMARK_URL));
                //实例化画布
                Graphics g = Graphics.FromImage(Cover);
                //在image上绘制水印
                g.DrawImage(watermark, new Rectangle(Cover.Width - watermark.Width, Cover.Height - watermark.Height, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel);
                //释放画布
                g.Dispose();
                //释放水印图片
                watermark.Dispose();
            }
            else
            {
                //加载默认图片
                Cover = Image.FromFile(context.Request.MapPath(DEFAULTIMAGE_URL));
            }
            //设置输出格式
            context.Response.ContentType = "image/jpeg";
            //将图片存入输出流
            Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            Cover.Dispose();
            context.Response.End();
        }


        #endregion
    }

}


============================================================================================================

要建立一个全局的一般处理程序步骤:

1)建一个类文件,继承自IHttpHandler接口并实现其方法,

2)ProcessRequest方法中对用户请求的文件进行处理,如何知道用户请求的是哪一个文件呢?  context.Request.PhysicalPath;

3)写好上述文件后,修改web.config  在   <httpHandlers>节点中添加下面一句话:

  <addverb="*"path="/images/bookcovers/*.jpg" type="BookShop.Web.Common.wmCode"  />

Verb表示请求方式 GET/POST 可以用*表示所有方式

Path 请求时,要转到全局一般处理程序的文件名 可以使用通配符

Type 把请求转给哪一个一般处理程序去处理,这里写类名.如果是WebSite,那么就写类名就行了.如果是Web应用程序,就写命名空间.类名

 

实现上面3,在测试环境下就可以了.如果要是放在iis,还是不可以.

 

在网站上点右键->属性->主目录->配置

 

添加一个映射:

 

1)水印

2)防盗链

3)下载rar/txt文件时进行权限验证