工作中遇到了这样的一个问题。起初觉得很简单,获得了图片的byte[]后,可以将其转换成内存中的图片对象(如System.Drawing.Image),而后赋给页面的Image控件。尝试后才发现这样根本做不到。搜索网络,整理出两种实现的方法。
一、引入一新页面.aspx,Image控件URL指向该页面
该页面ImageSource.aspx只完成一件事:将代表图片的byte[]写入http输出流。
1 Response.BinaryWrite(imgBytes);
该页面的执行效果即只显示图片本身。
使Image控件的ImageUrl属性指向该页面。
1 imgPicture.ImageUrl = string.Concat("ImageSource.aspx?name=", "Lighthouse");
功能实现。该种方式比较简单,但是弊端就是引入了一个貌似多余的页面ImageSource.aspx。为避免这一点,便有了第二种方法。
二、引入HttpHandler,专门处理图片加载的请求
Image控件依然通过ImageUrl属性指向一页面url,但该页面并不真实存在。该请求交由Handler处理。
1 <httpHandlers> 2 <add verb="*" path="ImageVirtualSource.aspx" type="ImageBytesShowSample.ImageVirtualSourceHandler"/> 3 </httpHandlers>
ImageVirtualSourceHandler中完成的工作基本与先前ImageSource.aspx中无异,主要就是将图片byte[]输出到http流。
1 public void ProcessRequest(HttpContext context) 2 { 3 var imgName = context.Request.QueryString["name"]; 4 var lightImg = Image.FromFile(string.Concat("E:\\CSPro\\ImageBytesShowSample\\ImageBytesShowSample\\", imgName, ".jpg")); 5 6 Byte[] imgBytes = ImageToBytes(lightImg); 7 8 context.Response.BinaryWrite(imgBytes); 9 }
特别注意:
若使用集成环境运行(VS调试运行),<system.web>下<httpHandlers>配置不被识别。请改为在IIS经典模式下运行或者将configuration移到<system.webServer>下。
1 <system.webServer> 2 <handlers> 3 <add name ="virtualImageHandler" verb="*" path="ImageVirtualSource.aspx" type="ImageBytesShowSample.ImageVirtualSourceHandler"/> 4 </handlers> 5 </system.webServer>
时间: 2024-10-12 15:18:45