有没有办法在不读取整个文件的情况下推断文件是啥图像格式?

Posted

技术标签:

【中文标题】有没有办法在不读取整个文件的情况下推断文件是啥图像格式?【英文标题】:Is there a way to infer what image format a file is, without reading the entire file?有没有办法在不读取整个文件的情况下推断文件是什么图像格式? 【发布时间】:2010-09-08 08:09:37 【问题描述】:

有没有一种无需将整个文件读入内存即可查看图像格式的好方法?

显然,这会因格式而异(我对 TIFF 文件特别感兴趣),但哪种程序有助于确定文件的图像格式而无需通读整个文件?

奖励:如果图像是 Base64 编码的字符串怎么办?在解码之前有什么可靠的推断方法吗?

【问题讨论】:

【参考方案1】:

当然有。就像其他人提到的那样,大多数图像都以某种“魔术”开头,它总是会转换为某种 Base64 数据。以下是几个例子:

位图将以Qk3开头

Jpeg 将以 /9j/ 开头

GIF 将以 R0l 开头(第二个字符是零)。

等等。获取不同的图像类型并找出它们编码的内容并不难。请小心,因为有些魔法不止一种,所以您需要在您的 B64“翻译代码”中说明它们。

【讨论】:

【参考方案2】:

TIFF 将以 II 或 MM(英特尔字节排序或摩托罗拉)开头。 TIFF 6 规范可以在here 下载,并且不难理解

【讨论】:

【参考方案3】:

在 *nix 命令行上的 file 或读取文件的初始字节。大多数文件在前几个字节中都有一个唯一的标题。例如,TIFF 的标​​头看起来像这样:

0x00000000: 4949 2a00 0800 0000
有关 TIFF 文件格式的更多信息,特别是如果您想知道这些字节代表什么,请转到 here。

【讨论】:

说“类似的东西”很危险。有两个有效的 tiff 标头:49 49 2a 00 或 4d 4d 00 2a。 49 49 格式在大部分文件中使用英特尔字节排序(小端),4d 4d 使用摩托罗拉字节(大端),这意味着 2a 和 00 与英特尔相反。【参考方案4】:

大多数图像文件格式的开头都有唯一的字节。 unix file 命令查看文件的开头以查看它包含的数据类型。请参阅有关 Magic numbers in files 和 magicdb.org 的***文章。

【讨论】:

除了结尾有幻数的 Targa,以及一些 RAW 风格,它们与 TIFF 完全没有区别,只是它们不解码(反之亦然)。

以上是关于有没有办法在不读取整个文件的情况下推断文件是啥图像格式?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不读取整个文件的情况下推断文件是啥图像格式?

有没有办法在不读取整个文件的情况下推断文件是啥图像格式?

在不读取整个文件的情况下获取图像尺寸

在不读取整个文件的情况下获取图像尺寸

有没有办法在不将完整文件加载到内存的情况下将 tiff 图像转换为 Base64

有没有办法在不使用画布 API 的情况下从图像文件中获取二进制数据?