ImagemagickはLinuxでPPMを生成するために使用され、PPMを読み取ることができません。

ImagemagickはLinuxでPPMを生成するために使用され、PPMを読み取ることができません。

プログラムの生データソースとしてPPMを生成する必要があります。入力としてpngファイルがたくさんあり、これをppmに変換します。同様のツールを使用しようとすると、mogrifyどの画像ビューアプログラム(GIMPなど)でも読み取れないファイルが生成されます。

mogrify -format ppm *.png

netpbmパッケージをインストールしました。他の場所で任意の他のPPMを開いてみましたが、すべての画像ビューアでこれらのファイルを開いて読み取ることができます。自分で作成したファイルに問題があります。を使用して生成されたファイルは、そのmogrify解像度に適したサイズに見え、ビットを含みます。

Hexファイルビューアでは、作業ファイルのヘッダーは次のとおりです。

P6 640480 25

Imagemagickを使用して以下を作成しました。

P7幅640高さ480深さ3 MAXVAL 255 TUPLTYPE RGB ENDHD

おそらく、ファイル形式を正しく作成するためにImagemagickに他のパラメータを提供する必要があるかもしれません。しかし、どうなりますか?それともpngをppmに簡単に変換できる他のツールはありますか?

ベストアンサー1

ウィキペディアページを見ると生産計画管理そしてポリアクリルアミドPPMのマジックナンバーは次のとおりです。

から抜粋PPM Wikipediaページ

各ファイルは、ファイルタイプ(PBM、PGM、PPM)とエンコード(ASCIIまたはバイナリ)を記述する2バイトのマジック番号(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 Wikipediaのページ

PAMファイル形式のヘッダーはP7で始まり(他の形式とは異なり)、明示的な終了者:ENDHDRで終わります。

PAMの単純な(人間が読める、ASCIIベースの)バージョンはありません。 PAMファイルは常にバイナリであり、PAM出力を生成するNetpbmプログラムで-plainスイッチを使用しようとするとエラーメッセージが表示されます。

PBMに対応する白黒バージョンのPAM(深さ1、タプルタイプBLACKANDWHITE)の場合、PAMはピクセルあたり1ビット(1バイトに8ピクセルを圧縮)を使用するPBMの代わりにピクセルあたり1バイトを使用します。さらに、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

16進ヘッダー情報:

$ 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.

ご覧のとおり、mogrifyPPMファイルが正しく作成されました(P6を参照)。

それでは何が間違っていますか?

私はPPMフォーマットがサポートしておらず、mogrifyが自動的に処理できないPPMに変換したいソースイメージに特別な点があるかどうか疑問に思います。

identifyソースイメージを調べるには、次のコマンドを使用することをお勧めします。

identify <original image>
編集#1

OPが元の画像を公開しました。ここmogrifyPPMファイルの代わりにPAMファイルが返されるこのイメージを直接実行して結果を再現することはできません。

生成された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つの違いは詳しくはこちらしかし、どうすればいいのかわかりません。

この問題の調査中に、sRBGとPNGに関連するImageMagickにバグがある複数のスレッドが見つかりました。これはリンク例

おすすめ記事