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