我需要生成 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 的神奇数字如下:
每个文件都以一个两字节幻数(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 文件格式的标头以 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 相关的错误。这是一个链接到一个示例。