圣诞节,25日,要交ACCP5.0认证的项目,其中有这样一个要求:书店的所有图书的封面放在了\images\convers\下面,要求所有引用这一路径下的图片都添加书店的店名水印图片。就是说拦截Http请求了,自然想到HttpHandler可以办到。考虑下,实现的效果应该是这样的:为了通用,监视的路径,水印图片路径,默认图片路径3者应该在配置文件里面设定,方便修改;监视路径下的所有图片只要物理存在都要有水印,物理不存在用默认图片替代,若水印图片不存在用文字代替。访问其他路径下的图片应该正常显示没有水印....废话不多说,实现的代码如下:为方便调试,编译httpHandler类的时候要加调试选项,并在项目中引用这个dll(编译:csc /t:library WatermarkHandler.cs /debug)

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace xumh
{
    /**//// <summary>
    /// 图片处理模块:给指定路径下的图片添加水印输出
    /// 1.监视的目录路径,水印图片路径,默认图片三者都在web.config文件中设定
    /// 2.请求的图片的路径不属于监视路径,直接输出图片
    /// 3.请求的图片的路径属于监视路径,若图片不存在,显示默认图片,不加水印
    /// 4.请求的图片的路径属于监视路径,且文件存在,添加水印
    ///        水印图片存在:图片+水印图片,输出
    ///        水印图片不存在:图片+水印文字,输出
    ///        
    /// 5.web.config部分如下:
    ///         <appSettings>
    ///                  <!--要监视的路径-->
    ///                     <add key="monitorPath" value="/images/bookcovers/"/>
    ///                 <!--图书封面不存在时显示的默认封面图片的相对路径-->
    ///                    <add key="defaultImage" value="images\default.jpg"/>
    ///                 <!--相对于物理应用程序的根路径的水印图片的相对路径-->
    ///                      <add key="watermarkImage" value="images\WaterMark.jpg"/>
    ///        </appSettings>
    ///     
    ///         <httpHandlers>
    ///                <add verb="*" path="*.jpg" type="xumh.WatermarkHandler,WatermarkHandler"/>
    ///            </httpHandlers>
    ///       许明会  2007-12-23 18:00 Visual Studio 2005 调试通过
    /// </summary>
    public class WatermarkHandler:IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            string url = context.Request.Url.AbsoluteUri.ToLower();
            string monitorPath = System.Configuration.ConfigurationManager.AppSettings["monitorPath"];
            //若图片不属于封面,直接输出图片:若图片不存在不做处理
            bool IsInterestUrl = url.Contains(monitorPath);
            System.Drawing.Image imgSource = null;
            if (!IsInterestUrl)  
            {
                if (!System.IO.File.Exists(context.Request.PhysicalPath))
                    return;
                imgSource = System.Drawing.Image.FromFile(context.Request.PhysicalPath);
                imgSource.Save(context.Response.OutputStream, imgSource.RawFormat);
                imgSource.Dispose();
                return;
            } 
            //图片属于封面,但图片imageSource不存在,显示默认图片default.jpg
            string physicalPath = context.Request.PhysicalPath;// context.Server.MapPath(url);
            if (!System.IO.File.Exists(physicalPath))
            {
                string defaultImage = System.Configuration.ConfigurationManager.AppSettings["defaultImage"];
                imgSource = System.Drawing.Image.FromFile(context.Request.PhysicalApplicationPath + defaultImage);
                imgSource.Save(context.Response.OutputStream, imgSource.RawFormat);
                imgSource.Dispose();
                return;
            }
            //--===--------------------只要有封面图片,就为图片添加水印----------------------===---
            string watermarkImage = System.Configuration.ConfigurationManager.AppSettings["watermarkImage"];
            string watermarkImagePath = context.Request.PhysicalApplicationPath + watermarkImage;
            bool bWatermarkImageExist =System.IO.File.Exists(watermarkImagePath);
            imgSource = System.Drawing.Image.FromFile(physicalPath);
            System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(imgSource);
            if (bWatermarkImageExist) //“水印图片”存在:存在则封面混合水印图片
            {
                System.Drawing.Image imgWatermark = System.Drawing.Image.FromFile(watermarkImagePath);
                graphic.DrawImage(imgWatermark,
                    imgSource.Width - imgWatermark.Width, imgSource.Height - imgWatermark.Height,
                    imgWatermark.Width, imgWatermark.Height);
                //把图片保存到输出流
                imgSource.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                imgWatermark.Dispose();
            }
            else                               //“水印图片”不存在:输出文本
            {
                System.Drawing.Font font = new System.Drawing.Font("幼圆", 13.0f,System.Drawing.FontStyle.Bold);
                graphic.DrawString("第三波+书店",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();
        }
    }
}

转载于:https://www.cnblogs.com/flaaash/archive/2007/12/23/1011640.html

HttpHandler:给指定路径下的图片添加水印显示相关推荐

  1. 遍历指定目录下的图片文件 显示在gridview 并添加点击事件

    先上图: gridview布局 <?xml version="1.0" encoding="utf-8"?> <GridView xmlns: ...

  2. 将指定路径下的所有SVG文件导出成PNG等格式的图片(缩略图或原图大小)

    原文:将指定路径下的所有SVG文件导出成PNG等格式的图片(缩略图或原图大小) WPF的XAML文档(Main.xaml): <Window x:Class="SVG2Image.Ma ...

  3. 安卓调用系统拍照功能:1、启动拍照返回图片,2、启动拍照,图片存储在指定路径下

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统拍照功能,两种方式获取拍摄的照片. 1.启动系统拍照intent,并直接返回图片数据 2.启动系统拍照intent,拍照后存储在指定的路径 ...

  4. python 获取指定目录下的图片文件

    import os#获取指定路径下所有的图片文件 def listfile(dirpath):# pathdir = os.listdir(dirpath) #图片列表imgFileList = os ...

  5. android 浏览指定相册,Android -- 采用系统相册浏览指定路径下照片

    //打开系统相册 Intent intent=new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); s ...

  6. Qt5 实现文件复制并在指定路径下创建文件夹

    最近在基于qt5平台的应用界面上想实现本地选择文件,并把文件拷贝到指定路径下.找到以下这篇文章参考,参考其中几个函数的写法实现了想要的功能,故记录一下,方便以后查找参考. 我在头文件中定义几个变量: ...

  7. Java向将指定文件(含文件列表)或者指定路径下目录打包成zip格式

    Java向将指定文件(含文件列表)或者指定路径下目录打包成zip格式 运行环境 pom依赖 测试方法 测试效果 运行环境 1.springboot 2.2.x 2.maven 3.5.4 pom依赖 ...

  8. python3查找文件中指定字符串_Python3在指定路径下递归定位文件中出现的字符串...

    [本文出自天外归云的博客园] 脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息). 用到的python特性: 代码如下: import os import sys __all ...

  9. R语言使用fs包的dir_create函数在指定路径下创建新的文件夹、使用file_create函数在指定文件夹下创建文件

    R语言使用fs包的dir_create函数在指定路径下创建新的文件夹.使用file_create函数在指定文件夹下创建文件 目录

最新文章

  1. 守护网络安全,我们一直在努力
  2. 人脸对齐--Dense Face Alignment
  3. HDU - 1429 胜利大逃亡(续) (BFS+状压)
  4. CACTI 0.87e 安装
  5. python正则判断_Python 正则表达式
  6. python ping利用线程池获取在线设备
  7. java控制台高级_K9s Kubernetes的高级控制台
  8. WebBrowser是IE内置的浏览器控件
  9. Ubuntu IPFS小白安装入门教程
  10. Python argparse模块、argparse.ArgumentParser()用法解析
  11. 软件测试有效性指标,软件测试用例评审有效性的44个衡量标准[1]
  12. CSO246未能找到类型或命名空间名“System“(是否缺少using指令或程序集引用?)
  13. ORACLE sql 高级查询
  14. Java实验(18) 幻灯片放映
  15. 微信小程序,map地图中在底部添加半透明视图布局
  16. 黄金分割法python实现
  17. 政务OA办公系统搭建现状
  18. Java JDK 下载官方网站
  19. 嵌入式在军工卫星应用手持终端领域的应用
  20. 模电和数电在应用上的区别和联系

热门文章

  1. jqery获取每个月天数_三年级《年、月、日》单元重要知识点整理汇总,以及难点题型解析...
  2. 使用openssl,实现输入和输出都是字符串的类型,注意:输入最好是16的倍数
  3. flask 安装flask_resultful
  4. 王道考研 计算机网络7 TCP/IP参考模型
  5. 英语口语Week 15 Wednesday
  6. Docker CEO Ben Golub:Docker借助开源、天时走向成功
  7. 创业者谈:畏惧失败,但也要拥抱失败
  8. 开发优秀产品的六大秘诀
  9. 解决火车票网上订票难的方案
  10. 揭秘IT人才特点:中美印日四国程序员比较