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

IBr*_*IBr 5 imagemagick images png

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

mogrify -format ppm *.png
Run Code Online (Sandbox Code Playgroud)

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

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

P6 640 480 25

我用 Imagemagick 生成的:

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

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

slm*_*slm 4

如果您查看PPMPAM的维基百科页面,它会说 PPM 的神奇数字如下:

\n\n

摘自PPM 维基百科页面

\n\n
\n

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

\n
\n\n
Magic Number    Type           Encoding\nP1           Portable bitmap    ASCII\nP2           Portable graymap   ASCII\nP3           Portable pixmap    ASCII\nP4           Portable bitmap    Binary\nP5           Portable graymap   Binary\nP6           Portable pixmap    Binary\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

摘自PAM 维基百科页面

\n\n
\n

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

\n\n

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

\n\n

对于黑白版本的 PAM(深度 1,元组类型\n BLACKANDWHITE),对应于 PBM,PAM 每个像素使用一个字节,\n 而不是 PBM\xe2\x80\x99s 使用每个像素一位(将八个像素打包在一个字节中)。此外,此类 PAM 图像中的值 1 代表白色(\xe2\x80\x9clight\n on\xe2\x80\x9d),而不是 PBM 中的黑色(\xe2\x80\x9cink on\xe2\x80\ x9d)。

\n
\n\n

例子

\n\n

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

\n\n

将 blah.png 转换为 blah.ppm:

\n\n
mogrify -format ppm blah.png\n
Run Code Online (Sandbox Code Playgroud)\n\n

文件信息:

\n\n
$ ll |grep bla\n-rw-rw-r--   1 saml saml      11870 May 29 21:36 blah.png\n-rw-rw-r--   1 saml saml     530613 May 29 21:36 blah.ppm\n
Run Code Online (Sandbox Code Playgroud)\n\n

识别信息:

\n\n
$ identify blah.png blah.ppm \nblah.png PNG 926x191 926x191+0+0 8-bit DirectClass 11.9KB 0.000u 0:00.000\nblah.ppm[1] PNM 926x191 926x191+0+0 8-bit DirectClass 531KB 0.000u 0:00.000\n
Run Code Online (Sandbox Code Playgroud)\n\n

十六进制标头信息:

\n\n
$ xxd blah.ppm|head -3\n0000000: 5036 0a39 3236 2031 3931 0a32 3535 0af2  P6.926 191.255..\n0000010: f1f0 0000 0000 0000 0000 0000 0000 0000  ................\n0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................\n\n$ xxd blah.png |head -3\n0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR\n0000010: 0000 039e 0000 00bf 0802 0000 0019 f594  ................\n0000020: be00 0000 0373 4249 5408 0808 dbe1 4fe0  .....sBIT.....O.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

那怎么了?

\n\n

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

\n\n

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

\n\n
identify <original image>\n
Run Code Online (Sandbox Code Playgroud)\n\n编辑 #1\n\n

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

\n\n

生成的 ppm:

\n\n
mogrify -format ppm some.png\n
Run Code Online (Sandbox Code Playgroud)\n\n

原始 png 和新 ppm 文件:

\n\n
 ll|grep some\n-rw-rw-r-- 1 saml saml     387940 May 30 00:36 some.png\n-rw-rw-r-- 1 saml saml     921615 May 30 07:00 some.ppm\n\n$ identify some.p*\nsome.png PNG 640x480 640x480+0+0 8-bit DirectClass 388KB 0.000u 0:00.000\nsome.ppm[1] PNM 640x480 640x480+0+0 8-bit DirectClass 922KB 0.000u 0:00.009\n
Run Code Online (Sandbox Code Playgroud)\n\n

文件头信息:

\n\n
$ xxd some.png |head -3\n0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR\n0000010: 0000 0280 0000 01e0 0802 0000 00ba b34b  ...............K\n0000020: b300 0020 0049 4441 5478 0184 c181 b21c  ... .IDATx......\n\n$ xxd some.ppm |head -3\n0000000: 5036 0a36 3430 2034 3830 0a32 3535 0a65  P6.640 480.255.e\n0000010: 6e6b 656e 6b62 6e6a 626e 6a5f 706a 5f70  nkenkbnjbnj_pj_p\n0000020: 6a5e 726b 5e72 6b5a 6d66 596c 6559 6a64  j^rk^rkZmfYleYjd\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n