PNM形式概説


1.概 要

 PNM形式は,以下のファイル形式の総称である.

 上記はそれぞれ,各画素の値(データ)を文字列で書き込むもの(アスキー形式)と,ビット列で書き込むもの(バイナリ形式)の2種類に分けられる.すなわち,PNM形式とは,合計6種類の形式の総称ということになる.

2.ファイルの構造

2.1 基本的な構造

 ファイルの先頭からヘッダ,データの順に書き込む.ヘッダは更に,マジックナンバー,横画素数,縦画素数,最大輝度(PBMはなし)の4つ(PBMは3つ)の部分に分けられる.各項目は表3に示す区切り文字で区切られる.

 表1にPNM形式のファイル構造を示す.表1において,文字列とは,単なる1文字以上の文字の組み合わせを指すものであり,C言語の文字列のように,特定の終端文字は伴うものではない.

表1 PNM形式のファイル構造
項番 項目 備考
1 ヘッダ マジックナンバー 表2のいずれかの文字列
区切り文字 表3のいずれかの文字
2 横画素数 アスキー形式,バイナリ形式のいずれの場合も文字列で書き込む.
区切り文字 表3のいずれかの文字を用いる.
3 縦画素数 アスキー形式,バイナリ形式のいずれの場合も文字列で書き込む.
区切り文字 表3のいずれかの文字を用いる.
4 最大輝度
  • PBM形式の場合は不要である.
  • アスキー形式,バイナリ形式のいずれの場合も文字列で書き込む.
区切り文字
  • PBM形式の場合は不要である.
  • 表3のいずれかの文字を用いる.
5 データ
  • 画素値を走査順に書き込む.
  • アスキー形式の場合は,画素値の間に区切り文字を入れる.

2.2 行の構成と長さ

 文字や文字列で書き込む部分については,1行当たり70文字以下とし,各行の末尾はLF(Line Feed:ASCIIコード=0xa)とする.

2.3 ヘッダ

 ヘッダは,全てのファイル形式において,ASCII文字列で書き込まれる.以下,各項目について説明する.

2.3.1 マジックナンバー

 マジックナンバーは,ファイル形式を示すものである.1.で述べたように6種類に分けられ,画像の種類とデータの形式によって表2のようになる.

表2 マジックナンバー
ファイル形式 マジックナンバー 画像の種類 データの形式
PBM P1 2値 アスキー
PGM P2 濃淡
PPM P3 カラー
PBM P4 2値 バイナリ
PGM P5 濃淡
PPM P6 カラー

2.3.2 区切り文字

 マジックナンバー,横画素数,縦画素数,最大輝度,データの各画素値の間には,それぞれ表3に示す区切り文字のいずれかを書き込む.

表3 区切り文字
略号 ASCIIコード(16進) 意味
HT 09 水平タブ(Horizontal Tablation)
LF 0A 改行(Line Feed)
CR 0D 行頭復帰(Carriage Return)
SP 20 空白(Space)

2.3.3 画素数と最大輝度

 横画素数,縦画素数,最大輝度は,データの形式に関わらず,その値を示す文字列で書き込まれる.ただし,PBM形式の画像については,最大輝度は不要である.

2.3.4 コメント

 ヘッダにはコメントを含めることができる.先頭が'#'で始まり,LFで終わる行はコメントとみなされる.

2.4 データ

2.4.1 各画素の値

 各画素の値は画像の種類によって,表4のように表される.

表4 各画素の値
画像の種類 ファイル形式
2値 PBM 白画素を0,黒画素を1と表す.
濃淡 PGM 輝度値を符号なしの整数で表す.
カラー PPM R,G,Bの各輝度値を符号なしの整数で表す.

2.4.2 走査

 各画素の値は,1次元に走査(スキャン)され,その順でファイルに書き込まれる.走査は上の行から下の行に向かって,順に行なわれる.また,各行においては,左から右に向かって行なわれる.図1は縦画素数,横画素数共8画素である画像について,走査される順序を示したものである.

図1 画素値が走査される順序
1 2 3 4 5 6 7 8
910 1112 1314 1516
1718 1920 2122 2324
2526 2728 2930 3132
3334 3536 3738 3940
4142 4344 4546 4748
4950 5152 5354 5556
5758 5960 6162 6364

2.4.3 アスキー形式における書き込み

 各画素の値は文字列として書き込まれる.また,各画素値の間には,表3に示す区切り文字が書き込まれる.PPM形式の画素値は,R,G,Bの順に並べた輝度値であり,各輝度値の間にも区切り文字が書き込まれる.

2.4.4 バイナリ形式における書き込み

 各形式に共通な事項と形式ごとに異なる部分に分けて示す.

(1) 共通事項

 各画素の値は,ビット列としてbyte単位で書き込まれる.各1[byte]の値はMSBから順に書き込まれる.区切り文字は不要である.

(2) PBM形式

 1画素当たり1[bit]で書き込み,1行毎に8[bit]=1[byte]の倍数になるようにする.1行分の画素値が8[bit]の倍数にならない場合,すなわち,横画素数が8の倍数でない場合には,各行の末尾のビットに適当な値をパディングし,8[bit]の倍数になるようにする.表5に横画素数と1行ごとに書き込まれるサイズの関係の例を示す.

(3) PGM形式

 1画素当たり1[byte]で書き込む.表5に横画素数と1行ごとに書き込まれるサイズの関係の例を示す.

(4) PPM形式

 R,G,Bの各輝度値それぞれについて1[byte]で書き込む.従って,1画素当たり3[byte]になる.また,各画素においては,R,G,Bの順に書き込まれる.表5に横画素数と1行ごとに書き込まれるサイズの関係の例を示す.

表5 バイナリ形式における1行あたりのサイズの例
横画素数 ファイル形式 マジックナンバー 計算上のサイズ[byte] 実際に書き込むサイズ[byte]
64 PBM P4 8 8
PGM P5 8 8
PPM P6 24 24
67 PBM P4 8.375
(8[byte]+3[bit])
9
PGM P5 9 9
PPM P6 27 27

3. ファイルの例

 表6にPNMアスキー各形式,表7にPNMバイナリ各形式のファイルの例を示す.ここで用いている画像の画素数等は次の通りである.

 表6はヘッダと画像1ライン程度のデータの内容を,表7は同程度のダンプリストを示したものである.表6のファイル冒頭部の内容において,各行の末尾には,文字としては見えないが,いずれもLFが書かれている.

表6 PNMアスキー形式ファイルの例
ファイル形式 ファイル冒頭部の内容 画像
PBMアスキー
P1
112 50
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
vline_binary
PGMアスキー
P2
112 50
255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 218
218 218 218 218 218 218 218 218 218 218 218 218 218 182 182
182 182 182 182 182 182 182 182 182 182 182 182 145 145 145
145 145 145 145 145 145 145 145 145 145 145 109 109 109 109
109 109 109 109 109 109 109 109 109 109 72 72 72 72 72
72 72 72 72 72 72 72 72 72 36 36 36 36 36 36
36 36 36 36 36 36 36 36 0 0 0 0 0 0 0
0 0 0 0 0 0 0
vline_gray
PPMアスキー
P3
112 50
255
255 0 0 255 0 0 255 0 0 255 0 0 255 0 0
255 0 0 255 0 0 255 0 0 255 0 0 255 0 0
255 0 0 255 0 0 255 0 0 255 0 0 255 0 255
255 0 255 255 0 255 255 0 255 255 0 255 255 0 255
255 0 255 255 0 255 255 0 255 255 0 255 255 0 255
255 0 255 255 0 255 255 0 255 255 255 0 255 255 0
255 255 0 255 255 0 255 255 0 255 255 0 255 255 0
255 255 0 255 255 0 255 255 0 255 255 0 255 255 0
255 255 0 255 255 0 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 255 0 0 255 0 0 255 0 0 255 0 0 255
0 0 255 0 0 255 0 0 255 0 0 255 0 0 255
0 0 255 0 0 255 0 0 255 0 0 255 0 255 0
0 255 0 0 255 0 0 255 0 0 255 0 0 255 0
0 255 0 0 255 0 0 255 0 0 255 0 0 255 0
0 255 0 0 255 0 0 255 0 0 255 255 0 255 255
0 255 255 0 255 255 0 255 255 0 255 255 0 255 255
0 255 255 0 255 255 0 255 255 0 255 255 0 255 255
0 255 255 0 255 255
vline_color
表7 PNMバイナリ形式ファイルの例
ファイル形式 ファイル冒頭部のダンプリスト 画像
PBMバイナリ
 Address  | 00 01 02 03 04 05 06 07   08 09 0A 0B 0C 0D 0E 0F 
----------+---------------------------------------------------
 00000000 | 50 34 0A 31 31 32 20 35 - 30 0A 00 03 FF F0 00 3F 
 00000010 | FF 00 03 FF F0 00 3F FF - 00 03 FF F0 00 3F FF 00 
vline_binary
PGMバイナリ
 Address  | 00 01 02 03 04 05 06 07   08 09 0A 0B 0C 0D 0E 0F 
----------+---------------------------------------------------
 00000000 | 50 35 0A 31 31 32 20 35 - 30 0A 32 35 35 0A FF FF 
 00000010 | FF FF FF FF FF FF FF FF - FF FF FF FF DA DA DA DA 
 00000020 | DA DA DA DA DA DA DA DA - DA DA B6 B6 B6 B6 B6 B6 
 00000030 | B6 B6 B6 B6 B6 B6 B6 B6 - 91 91 91 91 91 91 91 91 
 00000040 | 91 91 91 91 91 91 6D 6D - 6D 6D 6D 6D 6D 6D 6D 6D 
 00000050 | 6D 6D 6D 6D 48 48 48 48 - 48 48 48 48 48 48 48 48 
 00000060 | 48 48 24 24 24 24 24 24 - 24 24 24 24 24 24 24 24 
 00000070 | 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 FF FF 
vline_gray
PPMバイナリ
 Address  | 00 01 02 03 04 05 06 07   08 09 0A 0B 0C 0D 0E 0F 
----------+---------------------------------------------------
 00000000 | 50 36 0A 31 31 32 20 35 - 30 0A 32 35 35 0A FF 00 
 00000010 | 00 FF 00 00 FF 00 00 FF - 00 00 FF 00 00 FF 00 00 
 00000020 | FF 00 00 FF 00 00 FF 00 - 00 FF 00 00 FF 00 00 FF 
 00000030 | 00 00 FF 00 00 FF 00 00 - FF 00 FF FF 00 FF FF 00 
 00000040 | FF FF 00 FF FF 00 FF FF - 00 FF FF 00 FF FF 00 FF 
 00000050 | FF 00 FF FF 00 FF FF 00 - FF FF 00 FF FF 00 FF FF 
 00000060 | 00 FF FF FF 00 FF FF 00 - FF FF 00 FF FF 00 FF FF 
 00000070 | 00 FF FF 00 FF FF 00 FF - FF 00 FF FF 00 FF FF 00 
 00000080 | FF FF 00 FF FF 00 FF FF - 00 FF FF 00 FF FF FF FF 
 00000090 | FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF 
 000000A0 | FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF 
 000000B0 | FF FF FF FF FF FF 00 00 - 00 00 00 00 00 00 00 00 
 000000C0 | 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 
 000000D0 | 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 
 000000E0 | 00 00 FF 00 00 FF 00 00 - FF 00 00 FF 00 00 FF 00 
 000000F0 | 00 FF 00 00 FF 00 00 FF - 00 00 FF 00 00 FF 00 00 
 00000100 | FF 00 00 FF 00 00 FF 00 - 00 FF 00 FF 00 00 FF 00 
 00000110 | 00 FF 00 00 FF 00 00 FF - 00 00 FF 00 00 FF 00 00 
 00000120 | FF 00 00 FF 00 00 FF 00 - 00 FF 00 00 FF 00 00 FF 
 00000130 | 00 00 FF 00 00 FF FF 00 - FF FF 00 FF FF 00 FF FF 
 00000140 | 00 FF FF 00 FF FF 00 FF - FF 00 FF FF 00 FF FF 00 
 00000150 | FF FF 00 FF FF 00 FF FF - 00 FF FF 00 FF FF FF 00 
vline_color