2

首先,一点背景:

对于这篇序言的冗长性质,我提前道歉;但是,它可能有助于提供不特定于问题性质的替代解决方案。

我有一个使用嵌入式 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 中加载每个图像,然后使用canvasandtoDataUrl()来获取 base64 数据。然后,我没有将 URL 传递给 theUserControl并让它完成所有的工作,而是将 base64 数据作为 a 传递<PARAM>。然后它会快速将该数据转换回图像。

15 张图像的 15 秒现在不到 3 秒。因此,我开始寻找适用于 IE7/8 的 image->base64 解决方案。


以下是一些额外的要求/限制:

  • 解决方案不能有外部依赖项(即 $.getImageData)。
  • 它需要 100% 封装,以便便携。
  • 图片的来源和数量是可变的,它们必须是 URL 格式(base64 数据不是一个选项)。

我希望我已经提供了足够的信息,并且感谢您提供的任何指导。

谢谢。

4

1 回答 1

0

您可以使用任何 FlashCanvas、fxCanvas 或 excanvas 库,它们在旧 Internet Explorer 版本中使用 Flash 或 VML 模拟画布。我相信所有这些都提供了toDataURLCanvas API 的方法,允许您获得图像的编码表示。

经过广泛的挖掘(我在同一个修复中),我相信这是唯一的解决方案,没有编写一个可以将图像发送到的 PHP 脚本。当然,问题在于没有办法将图像发送到 PHP 脚本,除非这三个条件中的任何一个为真:

  • 浏览器支持类型化数组 ( Uint8Array)
  • 浏览器支持sendAsBinary
  • 图像正在由某人通过表单上传(在这种情况下,可以将其发送到以 base 64 编码响应的 PHP 脚本)
于 2013-03-27T02:24:35.497 回答