HTML5 将 png 缓冲区加载到画布中(用于流式传输)

2024-03-24

通过 websocket,我检索 PNG 格式的图像的二进制缓冲区(类似的东西 http://blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html).

我想将此 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);
}

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

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

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

有什么建议吗?


您可以将输入缓冲区转换为 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目前处于实验阶段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5 将 png 缓冲区加载到画布中(用于流式传输) 的相关文章

  • Vite Vue 3 库构建并不隐式包含 dist/style.css

    我构建了一个库项目 Vue 3 Vite 我想通过以下方式将其包含在主机项目中package json 但我遇到了一个问题 我可以导入组件并使用这些导入的组件运行一个简单的程序 但它们的样式消失了 请让我知道我的配置有什么问题 当我必须手动
  • 产生 ENOENT node.js 错误

    我已经使用express generator启动了一个node js应用程序 我有一个奇怪的问题 我无法通过浏览器查看页面两次 第一次加载正常 第二次加载失败 因为节点进程以出现以下错误 GET 304 412ms events js 72
  • 检查一个元素是否包含特定的子元素

    我有很多div有时包含链接 我想检查他们是否有链接 这是我的尝试 var container this closest content find text Check if text contains a tags if container
  • 在 Leaflet L.Draw 插件中以编程方式添加多边形

    有没有办法使用 Leaflet 绘制插件以编程方式添加多边形 https github com Leaflet Leaflet draw https github com Leaflet Leaflet draw 例如 单击一个按钮并添加一
  • jQuery 中的按钮点击

    我是 jQuery 新手 我想使用按钮单击事件来引发警报框 这是我的代码 但它似乎不起作用
  • 删除URL参数而不刷新页面

    我试图删除 之后的所有内容在文档准备好的浏览器 URL 中 这是我正在尝试的 jQuery document ready function var url window location href url url split 0 我可以做到
  • toLocaleLowerCase() 和 toLowerCase() 之间的区别[重复]

    这个问题在这里已经有答案了 我试图fiddle http jsfiddle net xameeramir kr33b0aL with toLocaleLowerCase http www w3schools com jsref jsref
  • 如何检查 Google 地图是否已完全加载?

    我正在将 Google 地图嵌入到我的网站中 加载 Google 地图后 我需要启动一些 JavaScript 进程 有没有办法自动检测 Google 地图何时完全加载 包括图块下载等 A tilesloaded 存在应该完全完成此任务的方
  • 如何从 API 获取雅虎天气背景?

    我有一个天气小部件 我需要动态背景 雅虎有天气 API 但我无法找到与天气类型相关的背景图像 https weather yahoo com https weather yahoo com 这可能吗 var url http query y
  • jquery ajax - 返回 json 或纯 html 更好

    当时间从ajax返回时 我应该返回 json 编码 并使用 jquery parseJSON 并使用 document createElement 并将数据附加到刚刚创建的元素内 或者最好以 html 文本形式返回 example div
  • 删除 highcharts.com 积分链接

    我刚刚购买高图表 http www highcharts com 但制作人员链接仍然出现在我的图表上 这些图表在我的网站上非常突出 并且扭曲了图表视图 我以为我会有一个选项 那么如何删除它呢 您可以自定义制作人员名单 更改 URL 文本 位
  • Highcharts 在导出时添加图像

    我使用具有导出功能的 Highcharts 根据我的理解 将图像添加到图表中 我可以使用渲染器 该渲染器工作正常 但我不希望图像 徽标 出现在应用程序中的图表上 我希望它出现仅在出口时 我该如何做到这一点 你应该使用图表选项 http ap
  • Array.filter 与 $filter('filter')

    我应该在 Angular 应用程序中使用哪一个 为什么 array filter o gt o name myName or filter filter array name myName true 关键的区别是快捷方式或语法糖由提供 fi
  • 如何在 JavaScript 中对混合数字/字母数字数组进行排序

    我有一个混合数组 我需要按数字 字母表然后按数字排序 A1 A10 A11 A12 A3A A3B A3 A4 B10 B2 F1 1 2 F3 我如何将其排序为 1 2 A1 A2 A3 A3A A3B A4 A10 A11 A12 B2
  • 将表格行换行到下一行

    table tr td testtesttesttest td td testtesttesttest td tr table 我想如果表格不适合屏幕 那么表格的第二个单元格将被转移到另一行 不是单元格中的文本 而是整个单元格 将单元格更改
  • 在 angular2 中使用 routerLink 更新模板

    当我移动到另一个模板时 我遇到了模板未更新的问题store location 例如 默认值为Eastleigh如果我搬到USA它将更改为USA但当我去其他地方时它就粘住了USA 我必须刷新页面以便模板更新Collection Store 事
  • Javascript 已禁用,简短的问题

    只是一些关于 javascript 和网站的简短问题 1 通过启用 javascript 是否意味着在浏览器设置中安装并启用了 sun java 或者每个浏览器都始终启用 JavaScript 吗 2 如果禁用 javascript 我的网
  • 获取具有最高属性值的对象的最佳方式

    我有以下学生对象的多维数组 var students name Jack age NYN attempts 3 wrong 2 name Phil age NNNY attempts 4 wrong 3 name Tom age attem
  • 流量类型问号?

    对使用 感到困惑在流动中 据我所知 感谢参数之前或之后的流类型问号 https stackoverflow com questions 47314749 flow type question mark before or after par
  • 无法使用“in”运算符在中搜索“_id”

    我正在尝试使用 mongoose 和express 来获取现有的用户文档 但我只得到这个 webroot api domain com production node modules mongoose lib document js 162

随机推荐