7
7

More than 1 year has passed since last update.

ImageMagick で PNM 画像

Last updated at Posted at 2017-12-27

PNM 形式は、ビットマップ画像の RGB 値をテキスト文字で表現できます。
ちょっとした実験用画像を作るのに重宝しますし、画像の RGB 値を確認する時にも便利です。

画像作成

以下の要件で画像を作って見ます。

  • RGB画像 => P3
  • 画像サイズ width:2 x height:2 => 2 2
  • 色階調 {0,1} の2階調で max が 1 => 1
  • 赤(1 0 0)、黄色(1 1 0)、緑(0 1 0)、青(0 0 1)
  • 2x2 画像は小さすぎるので、200x200 に拡大。
  • PNG 画像として保存
% cat opposite.pnm
P3
2 2
1
1 0 0  1 1 0
0 1 0  0 0 1
% convert opposite.pnm -scale 200x200 opposite.png

opposite.png

改行をサボれるので、1行コマンドにも出来ます。

echo "P3 2 2 1 1 0 0 1 1 0 0 1 0 0 0 1" | convert - -scale 200x200 opposite.png 

画像ダンプ

逆に PNG を PNM に戻す事も出来ます。

% convert opposite.png -scale 2x2 pnm:-
P6
2 2
255
�����%

BINARY 形式で出てしまいました。-compress none オプションで ASCII を出力できます。

% convert opposite.png -scale 2x2 -compress none pnm:-
P3
2 2
255
255 0 0  255 255 0
0 255 0  0 0 255

256階調の赤(255 0 0)、黄色(255 255 0)、緑(0 255 0)、青(0 0 255)ですので実質的に元に戻っています。

PNM の種類

PNM はいくつかのフォーマットをまとめた総称です。PNM ファミリーと呼称されます。テキストかバイナリか、色付きか色なしか等で種類があります。

マジックナンバー フォーマット名 データ表現 画像表現
P1 PBM ASCII image.png 白黒画像
P2 PGM ASCII image.png グレー画像
P3 PPM ASCII image.png カラー画像
P4 PBM Binary image.png 白黒画像
P5 PGM Binary image.png グレー画像
P6 PPM Binary image.png カラー画像
P7 PAM Binary image.png アルファ付きカラー画像
Pf PFM Binary image.png 浮動小数点形式グレースケール画像
PF PFM Binary image.png 浮動小数点形式カラー画像

P1(白黒), P2(グレースケール), P3(カラー) の実例を示します。

PBM (P1) 白黒

% cat batsu.pbm
P1
5 5
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1
% convert batsu.pbm -size 100x100 batsu-P1.png
batsu-P1.png
batsu-P1.png

ちなみに、1が黒で0が白です。

PGM: (P2) グレースケール

% cat batsu.pgm
P2
5 5
4
4 0 0 0 4
0 3 0 3 0
0 0 2 0 0
0 3 0 3 0
4 0 0 0 4
% convert batsu.pgm -scale 100x100 batsu-P2.png
batsu-P2.png
batsu-P2.png

こちらは 0 が黒で 最大値(この例では4)が白です。

PPM: (P3) カラー

% cat batsu.ppm 
P3
5 5
4
4 0 0  0 0 0  0 0 0  0 0 0  0 0 4
0 0 0  3 0 0  0 0 0  0 0 3  0 0 0
0 0 0  0 0 0  2 2 2  0 0 0  0 0 0
0 0 0  0 3 0  0 0 0  3 3 0  0 0 0
0 4 0  0 0 0  0 0 0  0 0 0  4 4 0
% convert batsu.ppm -scale 100x100 batsu-P3.png
batsu-P3.png
batsu-P3.png

拡張

P7(PAM)、Pf,PF(PFM) は狭義の PNM ファミリーに入らず、拡張フォーマット扱いされるようです。(要出典)
PAM は TUPLTYPE の後ろに RGB 等の色コンポーネント文字列をつける事で様々な色表現が使えます。公式仕様にはないのですが、ImageMagick は CMYK にも対応しています。

注意

最後の改行 (2021年12月9日追記)

最後が改行で終わらない PNM 画像は ImageMagick で処理できません。
なお、Netbpm でも失敗します。macOS の画像プレビューでも失敗します。

echo に -n (改行なし) をつけると確認できます。

% echo -n 'P3 2 2 1 1 0 0  1 1 0  0 1 0  0 0 1' | convert - output.png
convert: unable to read image data `/var/()' @ error/pnm.c/ReadPNMImage/1442.
convert: no images defined `opposite.png' @ error/convert.c/ConvertImageCommand/3322.

Adobe Phoroshop CC 2020 や GIMP 2.10 はこれを読み取れます。(macOS 版で確認しました)

参考

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7