首先,一点背景:
对于这篇序言的冗长性质,我提前道歉;但是,它可能有助于提供不特定于问题性质的替代解决方案。
我有一个使用嵌入式 WinForm 用户控件的 ASP.NET MVC 应用程序。这些控件通过Microsoft.Ink
库为 TabletPC 提供“墨水覆盖”支持。由于 IE8 企业标准,它们是一种不幸的必需品;否则,HTML5 Canvas 将是解决方案。
无论如何,图像 URLInkPicture
通过<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>
中的相应属性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 秒......不理想)。由于 FileIO 权限问题(无论是否完全信任,我未能成功消除该问题),因此在这种情况下执行Image img = new Bitmap(url);
此UserControl
操作不起作用。
初步解决方案
尽管使用canvas
不是当前的选项,但我决定使用它来测试解决方案。我会在 javascript 中加载每个图像,然后使用canvas
andtoDataUrl()
来获取 base64 数据。然后,我没有将 URL 传递给 theUserControl
并让它完成所有的工作,而是将 base64 数据作为 a 传递<PARAM>
。然后它会快速将该数据转换回图像。
15 张图像的 15 秒现在不到 3 秒。因此,我开始寻找适用于 IE7/8 的 image->base64 解决方案。
以下是一些额外的要求/限制:
- 解决方案不能有外部依赖项(即 $.getImageData)。
- 它需要 100% 封装,以便便携。
- 图片的来源和数量是可变的,它们必须是 URL 格式(base64 数据不是一个选项)。
我希望我已经提供了足够的信息,并且感谢您提供的任何指导。
谢谢。