自定义一个处理图片的HttpHandler
有时项目里我们必须将图片进行一定的操作,例如水印,下载等,为了方便和管理我们可以自定义一个HttpHander 来负责这些工作
后台:

public class ImageHandler : IHttpHandler
{
#region IHttpHandler Members public bool IsReusable
{
get { return true; }
} /// <summary>
/// 实现IHTTPHandler后必须实现的方法
/// </summary>
/// <param name="context">HttpContext上下文</param>
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
//得到图片名
var imageName = context.Request["ImageName"] == null ? "逆时针的风"
: context.Request["ImageName"].ToString();
//得到图片ID,这里只是演示,实际项目中不是这么做的
var id = context.Request["Id"] == null ? "01"
: context.Request["Id"].ToString();
//得到图片地址
var stringFilePath = context.Server.MapPath(string.Format("~/Image/{0}{1}.jpg", imageName, id));
//声明一个FileStream用来将图片暂时放入流中
FileStream stream = new FileStream(stringFilePath, FileMode.Open);
using (stream)
{
//透过GetImageFromStream方法将图片放入byte数组中
byte[] imageBytes = this.GetImageFromStream(stream,context);
//上下文确定写到客户短时的文件类型
context.Response.ContentType = "image/jpeg";
//上下文将imageBytes中的数据写到前段
context.Response.BinaryWrite(imageBytes);
stream.Close();
}
} /// <summary>
/// 将流中的图片信息放入byte数组后返回该数组
/// </summary>
/// <param name="stream">文件流</param>
/// <param name="context">上下文</param>
/// <returns></returns>
private byte[] GetImageFromStream(FileStream stream, HttpContext context)
{
//通过stream得到Image
Image image = Image.FromStream(stream);
//加上水印
image = SetWaterImage(image, context);
//得到一个ms对象
MemoryStream ms = new MemoryStream();
using (ms)
{
//将图片保存至内存流
image.Save(ms, ImageFormat.Jpeg);
byte[] imageBytes = new byte[ms.Length];
ms.Position = 0;
//通过内存流读取到imageBytes
ms.Read(imageBytes, 0, imageBytes.Length);
ms.Close();
//返回imageBytes
return imageBytes;
}
}
/// <summary>
/// 为图片加上水印,这个方法不用在意,只是演示,所以没加透明度
/// 下次再加上吧
/// </summary>
/// <param name="image">需要加水印的图片</param>
/// <param name="context">上下文</param>
/// <returns></returns>
private Image SetWaterImage(Image image,HttpContext context)
{
Graphics graphics = Graphics.FromImage(image);
Image waterImage = Image.FromFile(context.Server.MapPath("~/Image/逆时针的风01.jpg"));
//在大图右下角画上水印图就行
graphics.DrawImage(waterImage,
new Point {
X = image.Size.Width - waterImage.Size.Width,
Y = image.Size.Height - waterImage.Size.Height
});
return image;
} #endregion
}

别忘了还要在Web.Config中进行配置,别忘记verb和path属性,否则会报错
<httpHandlers>
<add type="ImageHandler.ImageHandler,ImageHandler" verb="*" path="ImageHandler.apsx"/>
</httpHandlers>
这样前台便能使用了

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
About
</h2>
<p>
Put content here.
<asp:Image runat="server" ImageUrl="ImageHandler.apsx?ImageName=逆时针的风&Id=02" />
</p>
</asp:Content>

输出结果
自定义一个处理图片的HttpHandler的更多相关文章
- SpringMVC 自定义一个拦截器
自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...
- jQuery Validate 表单验证插件----自定义一个验证方法
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...
- Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...
- JSTL,自定义一个标签的功能案例
1.自定义一个带有两个属性的标签<max>,用于计算并输出两个数的最大值: 2.自定义一个带有一个属性的标签<lxn:readFile src=“”>,用于输出指定文件的内容 ...
- 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件
Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...
- Volley HTTP库系列教程(5)自定义一个Volley请求
Implementing a Custom Request Previous Next This lesson teaches you to Write a Custom Request parse ...
- 在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:
在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性: var s = new MyString("hello"); s ...
- ExtJs5_继承自定义一个控件
Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...
- markdown 自定义一个锚点
//自定义锚点 s "m[": function mlink( text ) { var orig = String(text); // Inline content is pos ...
随机推荐
- formal parameter
formal parameter : [3.16] object declared as part of a function declaration or definition that acqui ...
- springBoot 定时器
程序入口类中加入注解 @EnableScheduling 配置定时任务为并行 @Slf4j @Configuration public class ScheduledConfig implements ...
- 搜狗拼音输入法LINUX版安装
搜狗拼音输入法LINUX版官方下载: http://pinyin.sogou.com/linux/?r=pinyin 一.添加fcitx的nightlyPPA 在终端中输入: sudo add-apt ...
- Codeforces Gym100814 B.Unlucky Teacher (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把标准答案推出来. 因为 ...
- 根据CPU核数合理设置线程池大小
一般来说池中总线程数是核心池线程数量两倍,只要确保当核心池有线程停止时,核心池外能有线程进入核心池即可. 我们所需要关心的主要是核心池线程的数量该如何设置. 自定义线程池代码 package com. ...
- dependencies与devDependencies的安装方法
npm install在安装node模块时,有两种命令参数可以把它们的信息写入package.json文件: –save –save-dev 但它的文档里1,只提到一个小区别,–save会把依赖包名称 ...
- SecureCRT双击Tab快速复制Session
- mysqldump实践
mysqldump mysqldump---逻辑备份,热备 单线程,适合数据量小的库 mysql官方自带的命令行工具 #全库 )mysqldump -uroot -p123456 --sock ...
- phpexcel设置所有单元格的默认对齐方式
代码如下,从国外论坛上找到的 $objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Styl ...
- cordova 中de.sitewaerts.cordova.documentviewer 插件 看pdf图片缩略图与实际图片不一致
//if (document == nil) // Unarchive failed so create a new ReaderDocument object //{ document = [[Re ...