2012-11-01 47 views
2

首先,一點背景爲Base64:轉換的圖像,而無需使用HTML5畫布

我道歉的時間,這篇序言的長篇大論性質進取;然而,它可能有助於提供一個與問題性質無關的替代解決方案。

我有一個使用嵌入式WinForm UserControls的ASP.NET MVC應用程序。這些控件通過Microsoft.Ink庫爲TabletPC提供「墨水覆蓋」支持。由於IE8企業標準,它們是不幸的必需品;否則,HTML5 Canvas將是解決方案。

無論如何,通過<PARAM>將圖像URL傳遞給InkPicture控件。

<object VIEWASEXT="true" classid="MyInkControl.dll#MyInkControl.MyInkControl" 
     id="myImage" name="myImage" runat="server"> 
    <PARAM name="ImageUrl" value="http://some-website/Content/images/myImage.png" /> 
</object> 

UserControl各個屬性採用該URL,調用一個執行HttpWebRequest的方法,以及返回的圖像被放置在InkPicture

public Image DownloadImage(string url) 
    { 
     Image _tmpImage = null; 

     try 
     { 
      // Open a connection 
      HttpWebRequest _HttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); 
      _HttpWebRequest.AllowWriteStreamBuffering = true; 

      // use the default credentials 
      _HttpWebRequest.Credentials = CredentialCache.DefaultCredentials; 

      // Request response: 
      System.Net.WebResponse _WebResponse = _HttpWebRequest.GetResponse(); 

      // Open data stream: 
      System.IO.Stream _WebStream = _WebResponse.GetResponseStream(); 

      // convert webstream to image 
      _tmpImage = Image.FromStream(_WebStream); 

      // Cleanup 
      _WebResponse.Close(); 
     } 
     catch (Exception ex) 
     { 
      // Error 
      throw ex; 
     } 

     return _tmpImage; 
    } 

問題

這工作,但在這一過程中顯著延遲我的網頁上加載大量的開銷(15幅拍攝了15秒不理想)。在UserControl中執行Image img = new Bitmap(url);在這種情況下無法工作,因爲FileIO權限問題(完全信任與否,我一直沒有成功解決該問題)。


初步解決方案

即使使用canvas不是當前選項,我決定用它來測試解決方案。我會加載每個圖像在JavaScript中,然後使用canvastoDataUrl()獲取base64數據。然後,我不是將URL傳遞給UserControl,而是讓它完成所有工作,我將base64數據作爲<PARAM>來代替。然後它將數據快速轉換回圖像。

對於15幅圖像15秒現在少於3秒。因此,我開始尋找在IE7/8中工作的image-> base64解決方案。


這裏有一些額外的要求/限制:

  • 溶液不能有外部依賴性(即$ .getImageData)。
  • 它需要100%封裝,因此可以攜帶。
  • 圖像的來源和數量是可變的,它們必須是URL格式(base64數據預先不是選項)。

我希望我已經提供了足夠的信息,我很欣賞你能給的任何方向。

謝謝。

+0

的可能的複製上傳[轉換圖像,而不畫布爲Base64] (http://stackoverflow.com/questions/193 10997 /轉換圖像到的base64無帆布) – JNF

回答

0

您可以使用任何FlashCanvas,fxCanvas或excanvas庫,它們可以在舊版Internet Explorer中使用Flash或VML模擬畫布。我相信所有這些都提供了Canvas API中的toDataURL方法,允許您獲得圖像的編碼表示。

經過廣泛的挖掘(我在同一個修復程序中)後,我相信這是唯一的解決方案,只需編寫一個PHP腳本即可發送圖像。與課程的問題是,沒有將圖像發送到PHP腳本,除非所有的這三個條件是正確的方式:

  • 瀏覽器支持類型數組(Uint8Array
  • 瀏覽器支持sendAsBinary
  • 的圖像是由某人經由形式(在這種情況下,它可以被髮送到一個PHP腳本與底座64編碼響應)