【问题标题】:HTML5 load a png buffer into a canvas (for streaming purpose)HTML5 将 png 缓冲区加载到画布中(用于流式传输)
【发布时间】:2013-12-09 16:16:11
【问题描述】:

通过 websocket,我以 PNG 格式 (something like that) 检索图像的二进制缓冲区。

我想将此PNG缓冲区加载到画布中,然后读取不同的像素以读取未压缩的数据。

我设法做到了,但这很愚蠢:

function onBinaryMessage(/*ArrayBuffer*/ input) {
  input = new Uint8Array(input);

  var str = '';
  for (var i = 0; i < input.byteLength; i++)
    str = str + String.fromCharCode(input[i]);

  var image = document.getElementById("image");
  image.src = 'data:image/png;base64,' + btoa(str);

  var c = document.getElementById("canvas");
  var ctx = c.getContext("2d");
  ctx.drawImage(image, 0, 0);
  var imgData = ctx.getImageData(0, 0, image.width, image.height);
  console.log(imgData);
}

我必须将我的二进制文件转换成一个字符串来对这个字符串进行编码64,然后我将我的图像src影响到这个新创建的编码64字符串...... 浏览器必须重新将此编码的 64 数据转换为我得到的原始 PNG 缓冲区...

有没有办法直接设置画布缓冲区? 或者有什么方法可以更好地处理流媒体?

我想我可以使用 File API 将缓冲区写入临时文件,但创建文件会花费很多:(

有什么建议吗?

【问题讨论】:

    标签: javascript html streaming html5-canvas buffer


    【解决方案1】:

    您可以将输入缓冲区转换为 Blob,获取它的 URL 并使用它在画布上进行绘制:

    function onBinaryMessage(input) {
    
        var blob = new Blob([input], {type: 'image/png'});
        var url = URL.createObjectURL(blob);
        var img = new Image;
    
        img.onload = function() {
            var ctx = document.getElementById("canvas").getContext('2d');
            ctx.drawImage(this, 0, 0);
            URL.revokeObjectURL(url);
        }
        img.src = url;
    }
    

    请注意,这将是异步的,您需要在 onload 处理程序中提供回调机制(无论如何,您也确实需要在自己的示例中这样做)。但是您不必转换为 base64 等,这是一项相对昂贵的操作。

    另请注意,URL.createObjectURL 目前处于试验阶段。

    【讨论】:

    • 非常感谢,我工作得很好。我几个小时前才找到答案,但你回答得比我快,而且答案更好,因为你没有创建图像 dom 元素。 createObjectURL 就像一个魅力,我可以将 FileReader 与 readAsDataURL 一起使用。但是 createObjectURL 必须更快,而且是同步调用。非常好的答案,非常感谢;)但是画布仍然是一个 dom 元素,我希望我可以使用新的画布,例如您刚刚编写的新图像。 (dom是邪恶的)
    • @Gb01 好消息,您也可以以这种方式使用画布。只需使用var canvas = document.createElement('canvas'); 即可,无需将其附加到 DOM(当然,像图像一样,它仍然是一个 dom element)。很高兴我能帮上忙! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2021-01-14
    相关资源
    最近更新 更多