まず、少し背景を説明します。
この序文が長くなってしまったことを、前もってお詫び申し上げます。ただし、質問の性質に固有ではない代替ソリューションを提供するのに役立つ場合があります。
組み込みの 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 を使用canvas
しtoDataUrl()
て base64 データを取得します。次に、URL を に渡してUserControl
すべての処理を実行させる代わりに、base64 データを として渡します<PARAM>
。次に、そのデータを画像にすばやく変換します。
15 枚の画像で 15 秒だった時間が 3 秒未満になりました。こうして、IE7/8 で動作する image->base64 ソリューションの検索が始まりました。
追加の要件/制限は次のとおりです。
- ソリューションに外部依存関係 (つまり、$.getImageData) を含めることはできません。
- 移植できるように、100% カプセル化する必要があります。
- 画像のソースと数量は可変であり、URL 形式である必要があります (事前に base64 データを使用することはできません)。
十分な情報を提供できたことを願っています。また、ご指示をいただければ幸いです。
ありがとう。