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 吗?
如果您查看PPM和PAM的维基百科页面,它会说 PPM 的神奇数字如下:
\n\n\n\n\n\n\n每个文件都以一个两字节幻数(ASCII 格式)开头,解释文件的类型(PBM、PGM 和 PPM)及其编码(ASCII 或二进制)。幻数是一个大写的 P 后跟一个数字。
\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\n\n\n\n\nPAM 文件格式的标头以 P7 开头,(与其他格式不同)以显式结束符结尾:ENDHDR。
\n\nPAM 没有简单的(人类可读的、基于 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
mogrify
如果我使用以下命令将 PNG 文件转换为 PPM 文件:
将 blah.png 转换为 blah.ppm:
\n\nmogrify -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)。
我想知道您要转换为 PPM 的源图像是否有一些特殊之处,而 PPM 格式不支持这种特殊情况,并且 mogrify 无法自动处理该问题。
\n\n我建议使用以下identify
命令询问源图像:
identify <original image>\n
Run Code Online (Sandbox Code Playgroud)\n\n编辑 #1\n\nOP在这里发布了原始图像。通过我自己运行此图像,我无法重现他的结果,其中mogrify
将返回 PAM 文件而不是 PPM 文件。
生成的 ppm:
\n\nmogrify -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”。这里详细介绍了这两者之间的区别,但我不确定如何理解它。
在研究这个问题时,我遇到了几个线程,其中 ImageMagick 中存在与 sRBG 和 PNG 相关的错误。这是一个示例的链接。
\n