【问题标题】:How can I pass a Bitmap from ASP.NET to JavaScript and display it?如何将位图从 ASP.NET 传递到 JavaScript 并显示它?
【发布时间】:2014-11-28 21:15:00
【问题描述】:

这是我的第一个 ASP.NET 应用程序,我在将服务器端 Bitmap 对象传递给 JavaScript 客户端时遇到了问题。我正在使用 SignalR 连接服务器和客户端。

我已经尝试了几件事,希望这对有 ASP.NET 经验的人来说很容易。

这是我的服务器端 C#:

    public void ScreenShot()
    {
        Rectangle bounds = this.Bounds;
        using (Image bitmap = new Bitmap(bounds.Width, bounds.Height))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
            }

            Clients.Caller.updateImage(bitmap);
        }
    }

在客户端,我想获取位图并显示它:

        hubproxy.client.updateImage = function (image) {
            var img = document.createElement("img");
            img.src = image;
            document.body.appendChild(img);
        };

我必须将其转换为 JSON 对象吗?如果我这样做,我如何将它恢复到客户端的图像?

提前感谢您的帮助。

【问题讨论】:

    标签: javascript c# asp.net signalr


    【解决方案1】:

    您可以将图像转换为字节数组:

    public static byte[] ImageToByte(Image img)
    {
       ImageConverter converter = new ImageConverter();
       return (byte[])converter.ConvertTo(img, typeof(byte[]));
    }
    

    然后将其编码为base64 - 您可以在html中使用base64作为图像源:

    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA..." />
    

    另一种方法是将该图像保存在服务器上并仅返回服务器上路径的链接,您可以使用 GUID 之类的东西来生成唯一名称并定期清理旧图像或在客户端断开连接后清理等。这样做的好处是在大图像上减少网络流量 - 只需发送文件名即可节省约 37% 的流量。

    【讨论】:

    • 谢谢,效果很好。鉴于仍需要传输图像文件,您如何节省网络流量?我认为通过发送原始数据可以节省一些时间,因为不会产生将图像写入磁盘的成本。
    • 图像的 base64 表示比二进制大。 stackoverflow.com/questions/11402329/base64-encoded-image-size
    • 您不需要将其写入磁盘,您可以在内存中缓存它并让控制器使用 GUID 作为标识符返回图像。使用 SignalR 发布该 GUID
    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2012-10-18
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多