Canvas.ToBlob 没有返回有效的 PNG?

扬·胡斯

我正在尝试将 canvas.toBlob 输出保存在 PNG 文件中,但输出似乎不是有效的 PNG(尽管它很接近)。第 1 个 4 字节应该是(十六进制)“89 50 4e 47”。相反,我得到了“ff fd 50 4e 47”,即不是“89”而是“ff fd”。当我尝试打开 PNG 文件时,Paint 等应用程序说它无效。下面的示例显示输出到控制台的格式,但不保存文件。

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.fillRect(25, 25, 100, 100);     

canvas.toBlob(function(blob) {
    const reader = new FileReader();
    reader.addEventListener('loadend', (e) => {
        var result = e.srcElement.result;
        var hex = StrToHex(result);
        console.log(`result=${result}`);
        console.log(`hex=${hex}`);
    });
    reader.readAsText(blob);
});
海道

没有编码参数的FileReader.readAsText将使用编码读取您的 Blob UTF-8

也就是说,字节89 50 4e 47变成了字符串�PNG你在这里做的是从这个字符串中获取十六进制,它与原始字节值不同:

// build a Blob from this hex string
const originalStrHex = '89 50 4e 47';
const hexAsUint8 = originalStrHex
  .split(' ')
  .map((v) => parseInt(v, 16));
const bytes= Uint8Array.from(hexAsUint8);
const reader = new FileReader();
reader.readAsText(new Blob([bytes]));
reader.onload = e => {
  const res = reader.result;
  console.log(res);
  const fromUTF8 = new TextEncoder().encode(res);
  const strHex = [...fromUTF8]
    .map(v => v.toString(16).padStart(2, "0"))
    .join(' ');
  // if that was correct, we should have had the same as originalStrHex
  console.log(strHex);
};

所以,很可能,你的 Blob 是正确的。
您想要的只是将其作为 ArrayBuffer而不是 UTF-8 字符串读取

document.createElement('canvas').toBlob(handleBlob);

function handleBlob(fullblob) {
  const blob = fullblob.slice(0, 4);
  const reader = new FileReader();
  reader.onload = e => {
    const view = new Uint8Array(reader.result);
    const strHex = [...view].map(v => v.toString(16).padStart(2, "0")).join(' ');
    console.log(strHex);
  };
  reader.readAsArrayBuffer(blob);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等待canvas.toBlob(),然后继续

来自分类Dev

Canvas.toBlob() 给出空白 blob 对象的 url?

来自分类Dev

ImageIO:PNG无效的PNG文件:iDOT没有指向有效的IDAT块

来自分类Dev

ImageIO:PNG无效的PNG文件:iDOT没有指向有效的IDAT块

来自分类Dev

canvas.toBlob()仍然无法在铬上工作...解决方法?

来自分类Dev

canvas.toBlob()方法在不同浏览器中的稳定性如何?

来自分类Dev

Blob不是Blob-如何在firestore Blob中存储canvas.toBlob?

来自分类Dev

PDFBOX JPG图像有效,但PNG不起作用

来自分类Dev

即使imshow有效,也无法写入PNG

来自分类Dev

PNG格式的屏幕捕获有效,但BMP格式无效

来自分类Dev

没有返回有效的JSON?

来自分类Dev

使用Webworkers和Canvas合并png图像

来自分类Dev

gganimate返回.png文件,但没有动画对象

来自分类Dev

XCode,在此检查有效的png代码中修复始终为true的警告

来自分类Dev

用于bash / linux的简单一线工具,以检查PNG是否有效?

来自分类Dev

XCode,在此检查有效的png代码中修复始终为true的警告

来自分类Dev

Javascript Canvas:如何有效计算两个画布的距离

来自分类Dev

自动播放视频的canvas.drawimage仅在可见视频元素时有效

来自分类Dev

PNG的ImageView没有出现(可能太大)

来自分类Dev

没有为VectorDrawable生成PNG

来自分类Dev

没有边框的Gnuplot PNG文件

来自分类Dev

WPF Canvas上没有Canvas.ZIndex或SetZIndex()属性

来自分类Dev

HTML Canvas标记的内容是否自动创建为PNG文件?

来自分类Dev

Download Canvas as PNG in fabric.js giving network Error

来自分类Dev

Javascript Canvas:如何获取透明png文件上的特定点?

来自分类Dev

有没有办法预测png大小?

来自分类Dev

我有一个PNG图片,想知道如何在python中将其有效地转换为PBM

来自分类Dev

带有Alpha背景的Png

来自分类Dev

没有有效的构造函数

Related 相关文章

  1. 1

    等待canvas.toBlob(),然后继续

  2. 2

    Canvas.toBlob() 给出空白 blob 对象的 url?

  3. 3

    ImageIO:PNG无效的PNG文件:iDOT没有指向有效的IDAT块

  4. 4

    ImageIO:PNG无效的PNG文件:iDOT没有指向有效的IDAT块

  5. 5

    canvas.toBlob()仍然无法在铬上工作...解决方法?

  6. 6

    canvas.toBlob()方法在不同浏览器中的稳定性如何?

  7. 7

    Blob不是Blob-如何在firestore Blob中存储canvas.toBlob?

  8. 8

    PDFBOX JPG图像有效,但PNG不起作用

  9. 9

    即使imshow有效,也无法写入PNG

  10. 10

    PNG格式的屏幕捕获有效,但BMP格式无效

  11. 11

    没有返回有效的JSON?

  12. 12

    使用Webworkers和Canvas合并png图像

  13. 13

    gganimate返回.png文件,但没有动画对象

  14. 14

    XCode,在此检查有效的png代码中修复始终为true的警告

  15. 15

    用于bash / linux的简单一线工具,以检查PNG是否有效?

  16. 16

    XCode,在此检查有效的png代码中修复始终为true的警告

  17. 17

    Javascript Canvas:如何有效计算两个画布的距离

  18. 18

    自动播放视频的canvas.drawimage仅在可见视频元素时有效

  19. 19

    PNG的ImageView没有出现(可能太大)

  20. 20

    没有为VectorDrawable生成PNG

  21. 21

    没有边框的Gnuplot PNG文件

  22. 22

    WPF Canvas上没有Canvas.ZIndex或SetZIndex()属性

  23. 23

    HTML Canvas标记的内容是否自动创建为PNG文件?

  24. 24

    Download Canvas as PNG in fabric.js giving network Error

  25. 25

    Javascript Canvas:如何获取透明png文件上的特定点?

  26. 26

    有没有办法预测png大小?

  27. 27

    我有一个PNG图片,想知道如何在python中将其有效地转换为PBM

  28. 28

    带有Alpha背景的Png

  29. 29

    没有有效的构造函数

热门标签

归档