工作中遇到了這樣的一個問題。起初覺得很簡單,獲得了圖片的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>