2

まず、少し背景を説明します。

この序文が長くなってしまったことを、前もってお詫び申し上げます。ただし、質問の性質に固有ではない代替ソリューションを提供するのに役立つ場合があります。

組み込みの WinForm UserControls を使用する ASP.NET MVC アプリケーションがあります。これらのコントロールは、ライブラリを介して TabletPC に「インクオーバー」サポートを提供しMicrosoft.Inkます。これらは、IE8 の企業標準のため、残念ながら必要です。それ以外の場合は、HTML5 Canvas が解決策になります。

InkPictureいずれにせよ、画像の URL は を介し​​てコントロールに渡されます<PARAM>

<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>

その URLのそれぞれのプロパティは、UserControlを実行するメソッドを呼び出し、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;
    }

問題

これは機能しますが、このプロセスには多くのオーバーヘッドがあり、Web ページの読み込みが大幅に遅れます (15 の画像に 15 秒かかります...理想的ではありません)。FileIO Permission の問題のため、この状況では動作Image img = new Bitmap(url);UserControlません (完全な信頼であるかどうかにかかわらず、私はその問題を解決できませんでした)。


初期解

使用canvasは現在のオプションではありませんが、それを使用してソリューションをテストすることにしました。各画像を JavaScript でロードし、 and を使用canvastoDataUrl()て base64 データを取得します。次に、URL を に渡してUserControlすべての処理を実行させる代わりに、base64 データを として渡します<PARAM>。次に、そのデータを画像にすばやく変換します。

15 枚の画像で 15 秒だった時間が 3 秒未満になりました。こうして、IE7/8 で動作する image->base64 ソリューションの検索が始まりました。


追加の要件/制限は次のとおりです。

  • ソリューションに外部依存関係 (つまり、$.getImageData) を含めることはできません。
  • 移植できるように、100% カプセル化する必要があります。
  • 画像のソースと数量は可変であり、URL 形式である必要があります (事前に base64 データを使用することはできません)。

十分な情報を提供できたことを願っています。また、ご指示をいただければ幸いです。

ありがとう。

4

1 に答える 1

0

古い Internet Explorer バージョンで Flash または VML を使用してキャンバスをシミュレートする FlashCanvas、fxCanvas、または excanvas ライブラリのいずれかを使用できます。これらはすべてtoDataURLCanvas API のメソッドを提供し、画像のエンコードされた表現を取得できると思います。

広範囲に掘り下げた後(私は同じ修正をしています)、これが唯一の解決策であると思います。画像を送信できるPHPスクリプトを書くことはできません。もちろん、問題は、次の 3 つの条件のいずれかが true でない限り、PHP スクリプトに画像を送信する方法がないことです。

  • ブラウザーは型付き配列をサポートしています ( Uint8Array)
  • ブラウザが対応sendAsBinary
  • 画像がフォームを介して誰かによってアップロードされている (この場合、base 64 エンコーディングで応答する PHP スクリプトに送信できます)
于 2013-03-27T02:24:35.497 に答える