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
改行をサボれるので、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(白黒), 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 |
---|
ちなみに、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 |
---|
こちらは 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 |
---|
拡張
P7(PAM)、Pf,PF(PFM) は狭義の PNM ファミリーに入らず、拡張フォーマット扱いされるようです。(要出典)
PAM は TUPLTYPE の後ろに RGB 等の色コンポーネント文字列をつける事で様々な色表現が使えます。公式仕様にはないのですが、ImageMagick は CMYK にも対応しています。
注意
最後の改行 (2021年12月9日追記)
- Unable to read plain encoded PNM files #4546
最後が改行で終わらない 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 版で確認しました)