确定base64字符串或缓冲区是否包含没有元数据的JPEG或PNG?可能2 B

Slb*_*box 3 javascript base64 image node.js ecmascript-6

有没有办法使用节点,无论是原生还是插件?

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

Mar*_*ell 7

PNG文件的前八个字节始终包含以下值 - 请参阅PNG规范:

(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
Run Code Online (Sandbox Code Playgroud)

所以,如果我从任何PNG文件的开头拿8个字节并且base64编码如下,我得到:

head -c8 test.png | base64
iVBORw0KGgo=
Run Code Online (Sandbox Code Playgroud)

每个JPEG文件的前2个字节都包含ff d8在十六进制中 - 请参阅JPEG的Wikipedia条目.因此,如果我采用任何JPEG文件和base64编码前两个字节,如下所示,我得到:

head -c2 test.jpg | base64
/9g=
Run Code Online (Sandbox Code Playgroud)

所以我的建议是查看你的base64编码文件的前几个(10个for PNG和2个JPEG,总是排除=)字符,看看它们是否符合我的建议,然后用它作为决定因素 - 一定要输出错误消息,如果您的字符串不匹配,以防测试由于某种原因不够彻底!


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

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