• 图片显示时加水印(不改变原图片)


    [转]:http://adyhpq.blog.163.com/blog/

    刚刚写了一个在显示图片是加水印的程序(不改变原图片)的程序,写出来和大家分享一下,也许有的人已经早就会了

    原理很简单,就是拦截HTTP请求,写一个HttpHandler,首先我在web.config里面配置了图片的根路径:

    <appSettings>

        <add key="monitorPath" value="pictures"/>

     </appSettings>

    这个pictures是放所有图片的地方,包括下面的文件夹,从这里显示的图片都要加上水印.

    然后写一个类,继承HttpHandler,这个类将自动放在AppCode下面,如下:

    public class ShuiyinHandler:IHttpHandler

    {

        public bool IsReusable

        {

            get { return true; }

        }

        public void ProcessRequest(HttpContext context)

        {

            try

            {

                //得到请求路径

                string url = context.Request.Url.AbsoluteUri.ToLower();

                string monitorPath = ConfigurationManager.AppSettings["monitorPath"];

                //是否包含图片路径

                bool IsInterestUrl = url.Contains(monitorPath);

                System.Drawing.Image imgSource = null;

               

                  //判断原图片是否存在

                string physicalPath = context.Request.PhysicalPath;

                if (!System.IO.File.Exists(physicalPath))

                {

                    context.Response.Write("图片不存在");

                    return;

                }

                //如果不是要加水印的文件或文件夹,就原样输出

                if (!IsInterestUrl)

                {

                    imgSource = System.Drawing.Image.FromFile(physicalPath);

                    imgSource.Save(context.Response.OutputStream, imgSource.RawFormat);

                    imgSource.Dispose();

                    return;

                }

                imgSource = System.Drawing.Image.FromFile(physicalPath);

                //判断是否是索引图像格式

                if (imgSource.PixelFormat == PixelFormat.Format1bppIndexed || imgSource.PixelFormat == PixelFormat.Format4bppIndexed || imgSource.PixelFormat == PixelFormat.Format8bppIndexed)

                {

                    //转成位图,这步很重要

                    Bitmap bitmap = new Bitmap(imgSource.Width, imgSource.Height);

                    System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(bitmap);

                    System.Drawing.Font font = new System.Drawing.Font("Arial Black", 30.0f, System.Drawing.FontStyle.Bold);

                    //将原图画在位图上

                    graphic.DrawImage(imgSource, new Point(0, 0));

                    //将水印加在位图上

                    graphic.DrawString("www.dgxyt.com", font, System.Drawing.Brushes.Red, new System.Drawing.PointF());

                        //将位图输入到流

                    bitmap.Save(context.Response.OutputStream, ImageFormat.Jpeg);

                    graphic.Dispose();

                    imgSource.Dispose();

                    bitmap.Dispose();

                }

                else

                {

                    //不是索引图像格式,直接在上面加上水印

                    System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(imgSource);

                    System.Drawing.Font font = new System.Drawing.Font("Arial Black", 30.0f, System.Drawing.FontStyle.Bold);

                    graphic.DrawString("www.dgxyt.com", font, System.Drawing.Brushes.Red, new System.Drawing.PointF());

                    imgSource.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

                    imgSource.Dispose();

                    graphic.Dispose();

                }

                //标明类型为jpg:如果不标注,IE没有问题,但Firefox会出现乱码

                context.Response.ContentType = "image/jpeg";

                context.Response.Flush();

                context.Response.End();

            }

            catch

            {

                throw;

            }

        }

    }

     

    这样HttpHandler写好了,在web.config中中的HttpHandler节点下,加下如下代码:

    <httpHandlers>

          <add verb="*" path="*.jpg,*.bmp,*.ico,*.jpeg" type="ShuiyinHandler"/>

      </httpHandlers>

     

    这表示,jpg,bmp,ico,jpeg都可以加上水印,gif没有试过,不过大家可以试下.

     

    写好之后,放在IIS上,居然不出来加水印的效果,这让我郁闷了好久,后来终于找到原因,原来是没有在IIS上没有注册以jpg,bmp,ico,jpeg为后缀的文件,IIS默认是不处理这些文件的。

     

    处理方法:在网站上目录上右击,选择属性,选择主目录,配置,

    随便选择列表中的一行,点击编缉,复制执行文件的路径,然后关闭,再点击添加,可执行文件用粘贴就可以了,后缀名写上.jpg,点击确定。按此方法再添加其他后缀名。

     

    这样就实现水印效果了。

  • 相关阅读:
    [原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI
    [原创]java WEB学习笔记96:Spring学习---Spring简介及HelloWord
    [原创]java WEB学习笔记95:Hibernate 目录
    [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
    [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
    [原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页
    [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解
    [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
    [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
    [原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)
  • 原文地址:https://www.cnblogs.com/sainaxingxing/p/1283303.html
Copyright © 2020-2023  润新知