【问题标题】:How to recognize an image file format using its contents?如何使用其内容识别图像文件格式?
【发布时间】:2019-11-19 18:59:02
【问题描述】:

如果图像文件的格式为 .png,那么它将在文件的开头包含 ‰PNG。 (在文本模式下阅读时)

如果图像文件的格式为 .bmp,那么它将在文件的开头包含 BM。 (在文本模式下阅读时)

我知道Image格式在文件开头包含一定大小(字节)的文本(数据),用作Image文件的元数据?

我的问题是:-

  • 这种行为在所有图像文件格式(或一般格式)中都相同吗?
  • 是否可以仅使用此数据识别图像文件(无扩展名)?

  • 是否有关于如何分解此元数据的信息?我的意思是,元数据中哪个位置的数据有什么意义?

【问题讨论】:

    标签: image image-processing metadata file-format


    【解决方案1】:

    这种行为在所有图像文件格式(或 一般)?

    对他们中的大多数人来说,是的。有一些专有格式(例如游戏)可能有非常短的元数据或没有元数据。此外,元数据可能在另一个文件中(例如动画和 XML 元数据)。

    可以仅使用此识别图像文件(无扩展名)吗 数据?

    是的。事实上,如果图像文件的扩展名不正确,大多数图像查看器都会警告您,并询问您是否应该修复它。

    在 Unix 系统上,有一个 file command,它根据文件的元数据来识别文件。有一个更好的工具专用于图像,称为identify (part of ImageMagick),它返回有关分辨率、位深度等的更详细信息。

    是否有关于如何分解此元数据的信息?经过 我的意思是,元数据中哪个位置的数据有什么意义?

    有关于(图像)文件格式的书籍,对于大多数格式,此信息可在官方规范中找到(例如,RFC 2083 用于 PNG)。它们列出了所有(可选)文件内容,描述了压缩以及查看器/解码器/编码器可以/必须/应该对数据做什么。一个好的起点可能是Wikipedia list of image file formats

    请注意,根据您提供的示例,我假设您使用文本编辑器打开文件,这不是该任务的理想工具。为此最好使用hex-editor。默认情况下,文本编辑器不会显示大多数字节(例如 255)并解释其他字节(例如制表符或换行符)。它们可能足以看到像“BM”和“PNG”这样的神奇文本字符串,但是使用十六进制编辑器,您可以看到这些文本部分及其数字表示 - 例如允许您提取图像的宽度和高度。为此,一些将hexademical 值转换为十进制的工具很有用,大多数计算器都可以做到这一点。

    作为一个例子,让我们看看在文本编辑器和十六进制编辑器中分辨率为 6146 x 14293 的 PNG 文件的开头:

    你可以看到文件在他们两个都是PNG图像,这是正确的。但是十六进制编辑器视图中标记的部分将显示图像的宽度和高度(匹配PNG chunk specification of the "IHDR" part) - 0x00001802 是十进制的 6146,0x000037D5 是 14293。在文本编辑器中没有办法做到这一点.

    另外请注意,即使您不知道图像格式,您也可能会幸运地猜到它是未压缩的数据(这通常适用于某些游戏图像文件格式,最著名的 Unity 的“资产”)。例如。如果您将文件重命名为“.raw”,图像查看器IrfanView 会给您一个对话框(请参见下面的屏幕截图),您可以在其中猜测图像的宽度、高度和位深度,看看结果是否看起来不错。这需要一些解释结果的经验,但如果宽度和位深度不匹配,图像会看起来像噪点、扭曲或颜色错误。

    这种“图像几何猜测”可以通过尝试不同的宽度并计算两条线之间的相关系数来改进/自动化。工具raw2tiff 可以做到这一点。网站引述:

    没有魔法,它只是一个数理统计,所以它可以 在某些情况下是错误的。但是对于大多数普通图像的猜测​​方法会 工作正常。

    【讨论】:

    • 不错的答案 (+1)。顺便说一句,您能解释一下为什么您建议使用十六进制编辑器而不是简单的纯文本编辑器(如记事本)查看图像吗?
    • 谢谢,添加了有关文本与十六进制编辑器部分的更多信息。
    • 感谢可爱的解释!!还有 1 个问题,您说“有一些专有格式(例如游戏)可能有非常短或没有元数据”,那么这些图像的元数据(如大小、位深度、色彩空间等)如何) 成立?如果事先没有可用的相关数据,如何正确处理图像?
    • 严格来说,这是“另一个文件中的元数据”的另一种情况,例如所有图像可能具有 1000 x 1000 的标准尺寸,并且此信息位于游戏代码中的某个位置。另一个特殊情况示例是 Motion JPEG 格式,其中使用标准 JPG 标头,并且从电影中的 JPG 中删除此信息。
    • 感谢您花时间回答我的问题!!感谢您的努力。
    【解决方案2】:

    使用 Imagemagick,您可以获得 Imagemagick 可以从头文件中的“magick”数据中读取的格式的信息(如果可用),如下所示:

    convert image -format "%m\n" info:
    


    例如:

    convert lena.png -format "%m\n" info:
    PNG
    
    convert lena.jpg -format "%m\n" info:
    JPEG
    
    convert lena.pnm -format "%m\n" info:
    PPM
    


    即使删除了后缀,这仍然有效:

    convert lena_copy -format "%m\n" info:
    PNG
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-10
      • 2011-12-05
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多