簡體   English   中英

在不使用HTML5畫布的情況下將圖像轉換為base64

[英]Convert an image to base64 without using HTML5 Canvas

首先,有一點背景:

對於此序言的冗長性,我提前表示歉意。 但是,它可能有助於提供一種並非針對問題性質的替代解決方案。

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

無論如何,圖像URL通過<PARAM>傳遞到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秒……不理想)。 正在做Image img = new Bitmap(url); 由於FileIO權限問題(無論是否完全信任,我都無法成功消除該問題),因此UserControl則無法在這種情況下使用。


初始解決方案

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

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


以下是一些其他要求/限制:

  • 該解決方案不能具有外部依賴項(即$ .getImageData)。
  • 它需要100%封裝,以便可以移植。
  • 圖像的來源和數量是可變的,並且它們必須為URL格式(不能選擇使用base64數據)。

希望我提供了足夠的信息,也感謝您能提供的任何指導。

謝謝。

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

經過廣泛的挖掘(我使用的是相同的修補程序),我相信這是唯一的解決方案,只需編寫可將圖像發送到的PHP腳本即可。 當然,問題在於,除非滿足以下三個條件之一,否則無法將圖像發送到PHP腳本:

  • 瀏覽器支持類型化數組( Uint8Array
  • 瀏覽器支持sendAsBinary
  • 某人通過表單將圖像上傳(在這種情況下,可以將其發送到以base 64編碼作為響應的PHP腳本)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM