【问题标题】:Determine if a base64 string or a buffer contains JPEG or PNG without metadata? Possible?确定 base64 字符串或缓冲区是否包含没有元数据的 JPEG 或 PNG?可能的?
【发布时间】:2018-09-14 19:34:29
【问题描述】:

有没有办法使用节点来做到这一点,无论是本机还是插件?

我想要完成的是根据输入类型选择无损或有损图像压缩。在大型 JPEG 上无损是一场存储灾难。

【问题讨论】:

  • base64数据从哪里来,为什么来源不告诉你数据是什么类型?
  • 我的回答解决了您的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/…
  • 嘿,马克,我还不确定它是否能解决我的问题,因为我被拉向了另一个方向。我想也许不是,因为我经常处理剪贴板数据,我不确定它是否会有识别数据的前导字节,但我还不能确定。谢谢你的回答。如果它解决了我的问题,或者我没有尽快解决,因为它是这里的最佳答案,我会回来标记它已回答。再次感谢。

标签: javascript node.js image ecmascript-6 base64


【解决方案1】:

@MarkSetchell 的answer above 在理论上是正确的。 但是,实际上,它不适用于 JPG!

确实head -c2 test.jpg | base64产生/9g

然而

head -c3 test.jpg | base64`
/9j/

因此,如果您想“确定 base64 字符串或缓冲区是否包含 JPEG”,您需要测试它是否以 /9j 而不是 /9g 开头!

【讨论】:

    【解决方案2】:

    PNG 文件的前 8 个字节始终包含以下值 - 请参阅 PNG Specification

    (decimal)              137  80  78  71  13  10  26  10
    (hexadecimal)           89  50  4e  47  0d  0a  1a  0a
    (ASCII C notation)    \211   P   N   G  \r  \n \032 \n
    

    所以,如果我从任何 PNG 文件的开头取 8 个字节并按如下方式对其进行 base64 编码,我会得到:

    head -c8 test.png | base64
    iVBORw0KGgo=
    

    每个 JPEG 文件的前 2 个字节包含十六进制的 ff d8 - 请参阅 Wikipedia entry for JPEG。因此,如果我采用任何 JPEG 文件并对前两个字节进行 base64 编码,如下所示:

    head -c2 test.jpg | base64
    /9g=
    

    所以我的建议是查看 base64 编码文件的前几个字符(PNG 为 10 个,JPEG 为 2 个,始终不包括 =)字符,看看它们是否符合我的建议然后将其用作决定因素 - 如果您的字符串都不匹配,请确保输出错误消息,以防由于某种原因测试不够彻底!


    为什么 PNG 有 10 个字符?因为保证签名是 8 个字节,即 64 位,base64 每次拆分成 6 位生成一个字符,所以前 10 个字符是前 60 位。第 11 个字符将根据签名后的内容而有所不同。

    JPEG 的逻辑相同... 2 个字节是 16 位,这意味着保证 2 个字符每个对应于 6 位。第三个字符将根据 2 字节 SOI 标记后面的内容而有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2022-07-14
      • 2020-03-10
      • 1970-01-01
      相关资源
      最近更新 更多