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

圣诞节,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 下的复制命令,这几个比较靠谱

平时我们使用Linux复制命令的时候&#xff0c;一般使用 cp命令&#xff0c;但是cp 命令性能比较令人担忧使用tar 命令来拷贝大量文件通过对比下面的几个命令&#xff0c;在拷贝比较多而且比较大的文件的话&#xff0c;用git clone 比较靠谱&#xff0c;特别是复制代码库&#x…

Mendeley文献管理软件使用介绍

<!DOCTYPE html>New DocumentMendeley 是一款免费的跨平台文献管理软件&#xff0c;同时也是一个在线的学术社交网络平台。Mendeley 对 PDF、Bibtex 的支持非常好&#xff0c;可以直接导出 Bibtex 格式&#xff0c;还可以直接导入zotero数据库&#xff0c;决定了其兼容性…

过拟合问题——正则化方法

看了很多资料&#xff0c;本身想放一个正则化的概念的&#xff0c;实在不敢放&#xff0c;怕吓跑一堆人&#xff0c;所以&#xff0c;将就吧。首先&#xff0c;我们知道正则化&#xff08;Regularization&#xff09;是解决过拟合问题的&#xff0c;简单来说&#xff0c;过拟合…

CentOS 8明年正式停止维护,以后再也不会有免费的RHEL了!

CentOS 8 明年正式停止维护&#xff0c;以后再也不会有免费的 RHEL 了!CentOS 是 Community Enterprise Operating System&#xff08;社区企业操作系统&#xff09;的首字母缩写&#xff0c;是 100&#xff05; 重建的 RHEL&#xff08;红帽企业 Linux&#xff09;。尽管 RHEL…

Python sqlalchemy orm 多外键关联

多外键关联 注&#xff1a;在两个表之间进行多外键链接 如图&#xff1a; 案例&#xff1a; # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, ForeignKey, String, Column# 调用基类Base from sqlalchemy.ext.declarative import dec…

将DataFrame格式的数据存入到mysql数据库中

因为最近频繁操作数据库&#xff0c;特别是写入数据比较麻烦。在DataFrame格式或者是Series格式的数据处理之后&#xff0c;总是会面临写入数据&#xff0c;迫不得已只能进行格式转换&#xff0c;搜索过程中发现了to_sql&#xff08;&#xff09;函数&#xff0c;就百度了用法&…

从小米智能家居入手,揭秘物联网关键技术

物联网已不知不觉融入我们的生活中给我们带来便捷&#xff0c;比如&#xff0c;智能门锁、ETC 电子自动收费系统等&#xff0c;一开始感觉还挺很新奇的&#xff0c;现在也习以为常了。那到底什么是物联网&#xff1f;可能很多人还挺蒙圈的。所谓物联网&#xff0c;最终目的就是…

Orange——The Data

The Data 这个部分描述的是怎样在Orange上加载数据。我们也将展示如何探索数据&#xff0c;发现一些基本统计特性&#xff0c;怎么数据取样。 Data Input Orange可以读取本机以制表符分隔的格式的文件&#xff0c;也可以从任何主要的标准电子表格文件类型加载数据&#xff0…

[转载]VirtualBox网络配置详解

标题: [原创]VirtualBox网络配置详解来自 http://www.linuxsir.org/bbs/showthread.php?p1800679#post1800679 欢迎转载, 转载请注明作者, 谢谢下面简单介绍一下Test-bed Environment:Host : 偶的本本OS : Arch Linux (Kernel Version 2.6.20) 已安装uml_utilities(包含tunctl…

工作4年工资8K,还有什么理由不努力?

—— 提问发哥&#xff0c;我现在还是从事裸机开发&#xff0c;51单片机&#xff0c;会点arm&#xff0c;但没有用arm真正做完整开发的经验&#xff0c;细想感觉自己会的不是很多&#xff0c;薪资提不上去&#xff0c;想做更高级点的工作&#xff0c;虽然自学点&#xff0c;到没…

嵌入式的坑在哪方面?

在知乎看到的&#xff0c;觉得见解不错&#xff0c;看完我觉得会对嵌入式有些见解&#xff0c;分享给大家。今年毕业刚工作半年&#xff0c;稍微写一下自己的见解。嵌入式就个万金油&#xff01;干得活可以涉及硬件和软件&#xff01;永远学不完的知识。嵌入式工程师简直就是硬…

Orange-Classification,Regression

1.Classification Orange和sklearn一样&#xff0c;提供了Classification和Regression等机器学习的算法&#xff0c;具体使用如下&#xff1a; import Orangedata Orange.data.Table("voting") lr Orange.classification.LogisticRegressionLearner() rf Orange…

再见,杀毒软件之父,王江民!

王江民&#xff0c;中国最早的反病毒专家&#xff0c;被业界尊称“中国杀毒软件之父”、“中国反病毒第一人。以38岁为分界&#xff0c;王江民的前半生&#xff0c;是中国青年身残志坚的楷模&#xff0c;他的后半生是中国安全软件的奠基人&#xff0c;带领中国商用软件第一个走…

百面机器学习——第一章特征工程

特征工程&#xff1a;是对原始数据进行一系列工程处理&#xff0c;将其提炼为特征&#xff0c;作为输入供算法和模型使用。从本质上来讲&#xff0c;特征工程是一个表示和展现数据的过程。在实际工作中&#xff0c;特征工程旨在去除原始数据中的杂质和冗余&#xff0c;设计更高…

C语言不调用库函数画一个三角形

这个是知乎上面的一个题目&#xff0c;非常有意思&#xff0c;晚上打球回来就下决心要写代码实现下&#xff0c;再加上自己剖析&#xff0c;让大家明白一个三角形在坐标系中如何用C语言画出来的。https://www.zhihu.com/question/53832071/answer/1625616415第一步就是要先构建…

JS高级——变量提升

JS执行过程 1、首先是预解析&#xff1a;预解析过程最重要的是提升&#xff0c;在JavaScript代码在预解析阶段&#xff0c;会对以var声明的变量名&#xff0c;和function开头的语句块&#xff0c;进行提升操作 2、执行操作 全局中解析和执行过程 <script>console.log(a);…

图像多分类——卷积神经网络

例子参考&#xff1a;https://www.jiqizhixin.com/articles/2019-05-15-2 数据集&#xff1a;https://www.cs.ccu.edu.tw/~wtchu/projects/MoviePoster/index.html 将获取到原始数据集&#xff0c;其中&#xff0c;有三个文件&#xff0c; Movie Poster Dataset是1980-2015年…

学习C++,知识点太多记不住怎么办?

学习一门新的编程语言之前&#xff0c;你首先会做什么&#xff1f;先熟悉变量、运算符、函数、类和结构、测试等工具&#xff0c;随后按照指导按部就班进行操作&#xff1f;这样的流程对于学习其他语言如Python、Java来说或许行得通&#xff0c;但C的话&#xff0c;够呛。想要真…

C语言编程规范 clean code

目的规则并不是完美的&#xff0c;通过禁止在特定情况下有用的特性&#xff0c;可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”&#xff0c; 如果在团队运作中认为某个规则无法遵循&#xff0c;希望可以共同改进该规则。参考该规范之…

DataWhale组队-Pandas(下)缺失数据(打卡)

1.缺失值概要 数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失&#xff0c;两者都会造成分析结果的不准确&#xff0c;以下从缺失值产生的原因及影响扥方面展开分析。 &#xff08;1&#xff09;缺失值产生的原因 1&#xff09;有些信息暂时无法获取&#xff0c;或…