Imagemagick 用于在 Linux 中生成 PPM,PPM 不可读

Imagemagick 用于在 Linux 中生成 PPM,PPM 不可读

我需要生成 PPM 作为一个程序的原始数据源。我有一堆 png 作为输入,我将把它们转换为 ppm。当我尝试使用类似的工具时,mogrify它会生成文件,但任何图像查看器程序(例如 GIMP)都无法读取这些文件:

mogrify -format ppm *.png

我已经安装了netpbm包。我尝试从其他地方打开一些其他随机 PPM,任何图像查看器都可以打开并读取这些文件,我自己生成的文件存在问题。使用创建的文件mogrify似乎具有适合其分辨率的大小并且包含位。

在十六进制文件查看器中,工作文件头如下所示:

P6 640 480 25

我用 Imagemagick 生成的:

P7 宽度 640 高度 480 深度 3 MAXVAL 255 TUPLTYPE RGB ENDHD

也许我需要给 Imagemagick 一些其他参数来制作正确的文件格式,但是什么呢?或者有其他工具可以轻松地将 png 转换为 ppm 吗?

答案1

如果您查看维基百科页面生产计划管理聚丙烯酰胺它说 PPM 的神奇数字如下:

摘自PPM 维基百科页面

每个文件都以一个两字节幻数(ASCII 格式)开头,解释文件的类型(PBM、PGM 和 PPM)及其编码(ASCII 或二进制)。神奇数字是一个大写的 P 后跟一个单位数字。

Magic Number    Type           Encoding
P1           Portable bitmap    ASCII
P2           Portable graymap   ASCII
P3           Portable pixmap    ASCII
P4           Portable bitmap    Binary
P5           Portable graymap   Binary
P6           Portable pixmap    Binary

而 PAM 格式的神奇数字是 P7。与旧格式(PPM、PNM、PGM、PBM)相比,还存在以下差异:

摘自PAM 维基百科页面

PAM 文件格式的标头以 P7 开头,(与其他格式不同)以显式结束符结束:ENDHDR。

PAM 没有简单的(人类可读的、基于 ASCII 的)版本。 PAM 文件始终是二进制的,并且尝试将开关 -plain 与生成 PAM 输出的 Netpbm 程序一起使用会导致错误消息。

对于黑白版本的PAM(深度1,元组类型BLACKANDWHITE),对应于PBM,PAM每像素使用一个字节,而不是PBM每像素使用一位(将八个像素打包在一个字节中)。此外,此类 PAM 图像中的值 1 代表白色(“亮灯”),与 PBM 中的黑色(“墨亮”)相反。

例子

mogrify如果我使用以下命令将 PNG 文件转换为 PPM 文件:

将 blah.png 转换为 blah.ppm:

mogrify -format ppm blah.png

文件信息:

$ ll |grep bla
-rw-rw-r--   1 saml saml      11870 May 29 21:36 blah.png
-rw-rw-r--   1 saml saml     530613 May 29 21:36 blah.ppm

识别信息:

$ identify blah.png blah.ppm 
blah.png PNG 926x191 926x191+0+0 8-bit DirectClass 11.9KB 0.000u 0:00.000
blah.ppm[1] PNM 926x191 926x191+0+0 8-bit DirectClass 531KB 0.000u 0:00.000

十六进制标头信息:

$ xxd blah.ppm|head -3
0000000: 5036 0a39 3236 2031 3931 0a32 3535 0af2  P6.926 191.255..
0000010: f1f0 0000 0000 0000 0000 0000 0000 0000  ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................

$ xxd blah.png |head -3
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
0000010: 0000 039e 0000 00bf 0802 0000 0019 f594  ................
0000020: be00 0000 0373 4249 5408 0808 dbe1 4fe0  .....sBIT.....O.

可以看到,mogrify正确生成了PPM文件(参见P6)。

那么出了什么问题呢?

我想知道您要转换为 PPM 的源图像是否有一些特殊之处,而 PPM 格式不支持这种特殊情况,并且 mogrify 无法自动处理该问题。

我建议使用以下identify命令询问源图像:

identify <original image>
编辑#1

OP发布了原图这里。通过我自己运行此图像,我无法重现他的结果,其中mogrify将返回 PAM 文件而不是 PPM 文件。

生成的 ppm:

mogrify -format ppm some.png

原始 png 和新 ppm 文件:

 ll|grep some
-rw-rw-r-- 1 saml saml     387940 May 30 00:36 some.png
-rw-rw-r-- 1 saml saml     921615 May 30 07:00 some.ppm

$ identify some.p*
some.png PNG 640x480 640x480+0+0 8-bit DirectClass 388KB 0.000u 0:00.000
some.ppm[1] PNM 640x480 640x480+0+0 8-bit DirectClass 922KB 0.000u 0:00.009

文件头信息:

$ xxd some.png |head -3
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
0000010: 0000 0280 0000 01e0 0802 0000 00ba b34b  ...............K
0000020: b300 0020 0049 4441 5478 0184 c181 b21c  ... .IDATx......

$ xxd some.ppm |head -3
0000000: 5036 0a36 3430 2034 3830 0a32 3535 0a65  P6.640 480.255.e
0000010: 6e6b 656e 6b62 6e6a 626e 6a5f 706a 5f70  nkenkbnjbnj_pj_p
0000020: 6a5e 726b 5e72 6b5a 6d66 596c 6559 6a64  j^rk^rkZmfYleYjd

该文件对我来说已成功转换。运行display some.ppm显示了该文件,所以我不知道该怎么做。我确实注意到OP的识别命令将文件显示为sRGB,而在我的系统上这些文件显示为“8位DirectClass”。这2者之间的区别是详细信息在这里,但我不知道该怎么做。

在研究这个问题时,我遇到了几个线程,其中 ImageMagick 中存在与 sRBG 和 PNG 相关的错误。这是一个链接到一个示例

相关内容