PNMファイルの仕様について   20171129

PNMファイルの仕様は本家に説明がある。
本家URL : http://netpbm.sourceforge.net/doc/index.html

PNMの各ファイルは,形式や画像サイズなどを表すヘッダとそれに続く画像データでできているが,まとめると次の6種類のファイルがある。
PNMは「Portable aNyMap」 という画像形式を表しており,次の3つのフォーマットの総称である。
(1)PBM Portable Bitmap forMat これは2値白黒画像である
(2)PGM Portable Graymap forMat これはグレイスケール白黒画像である
(3)PPM Portable Pixmap forMat これはカラー画像である

1.ASCII形式で保存された白黒二値画像ファイル (PBM)
PBM形式のファイルは次のような構成になっている。
◯ヘッダ(どのファイル形式でもヘッダは必ずASCII形式)
 マジックナンバ「P1」
 単数または複数の「区切りコード*1」
 画像の横方向ピクセル数(画像の横幅)
 単数または複数の「区切りコード」
 画像の縦方向ピクセル数(画像の高さ)
 単数の「区切りコード」
 (ヘッダはこの順で記述されている)
◯画像データ(ASCII形式)
 黒は1,白は0で表すことにして,画像の左上から右方向にピクセル値を並べる。右端に達したら,
 左端に戻って同様にピクセル値を並べ続ける。
 画像データ内に単数または複数の「区切りコード」を挿入しても構わない。

*1 「 区切りコード」は次のものが使われる スペース文字(' '),CR('\r'),LF('\n'),TAB('\t')
(この他にもあるが,通常はこれらの4コードである。)
「区切りコード」で[LF]を使うとテキストエディタでは改行となり,行のイメージとなる。
この1行は70文字を超えてはならない。
                  参考(区切りコード)
呼び名
文字
ASCIIコード
読み
コメント(カーソルとは「次の文字の入力位置」)
スペース文字
' '
0x20
space

CR
'\r'
0x0d
Carriage Return
本来はカーソルを行頭へ戻す制御文字
LF
'\n'
0x0a
Line Feed
本来はカーソルを行頭へ戻さず改行だけ行う制御文字
TAB
'\t'
0x09
Tabulation
カーソルを横方向に決められた文字数進める制御文字

例 次の4つのファイル例はすべて「F」(白地の黒のF)を表示する正当なpbmファイルである。
どのファイルにおいても,ヘッダには,P1形式で,幅6,高さ7であることが書かれている。
画像ファイルはできるだけファイルサイズを小さく作りたいので,最小ファイル形式のように作られる。
あるいは,ほかのpnm形式との共通性を大事にした汎用形式が使われる。
(左の2つのファイルを画面から離れて見ると,Fの文字が見える)
一行あたり70文字制限があるため,画像1行とファイル上の1行は一致しない場合が多い。
[LF]は改行コードを表すが,[LF]表示はエディタでは見えない。
WindowsOSのもとでは改行には[CR][LF]が使われるが,「区切りコード」を複数個続けて置いてもよいので問題ない。

              P1形式ファイル例
ファイル例1 ファイル例2 ファイル例3 ファイル例4
最小ファイ
ル形式
汎用形式
これでもよい。
区切りコードは
[LF]とは限らず,
複数の区切りコー
ドが連続しても
良い。
画像1行とファイル上の1行が一致し
ない例
(これでもよい)
Windows版
改行に[CR][LF]が使われている
(複数の区切り文字が連続していても
良いのでこれも正当なPNMファイル)
(青字の部分が画像データ部と解釈
される)
P1[LF]
6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
P1[LF]
6 7[LF]
0 0 0 0 0 0[LF]
0 1 1 1 1 0[LF]
0 1 0 0 0 0[LF]
0 1 1 1 0 0[LF]
0 1 0 0 0 0[LF]
0 1 0 0 0 0[LF]
0 0 0 0 0 0[LF]
P1   6   7[LF]
   0 0 0 0 0 0[LF]
   0 1 1 1 1 0[LF]
   0 1 0 0 0 0[LF]
   0 1 1 1 0 0[LF]
   0 1 0 0 0 0[LF]
   0 1 0 0 0 0[LF]
   0 0 0 0 0 0[LF]
P1   6   7[CR][LF]
   0 0 0 0 0 0 0 1 1 1 1 0[CR][LF]
   0 1 0 0 0 0 0 1 1 1 0 0[CR][LF]
   0 1 0 0 0 0 0 1 0 0 0 0[CR][LF]
   0 0 0 0 0 0[CR][LF]

          テキストエディタとバイナリエディタによるP1形式ファイルの表示
ファイル例1をテキストエディタ
で見たところ
ファイル例1をバイナリエディタで見たところ



このファイルをviewerで表示するとつぎのように見える。(拡大している)


コメントの挿入について
「#」で始まって[CR]か[LF]で終わるデータの並びは,コメントとして扱われる。
コメントは行頭から始まっているとは限らない。
コメントは取り除いてからデータの読み取りが行われる。
コメントは[LF]までが取り除かれることに注意が必要である。

              コメントの取り扱いの例

元のファイル
コメントが取
り除かれた態
評価
例1
P1[LF]
#This is a test comment.[LF]
6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
P1[LF]
6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
正当なコメント入り
ファイル
例2
P1#This is a test comment.[LF]
[LF]
6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
P1[LF]
6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
正当なコメント入り
ファイル
例3
P1#This is a test comment.[LF]
6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
P16 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
不正なファイル

P1と次の行の6
がつながってし
まう。
例4
P1[LF]
6 7#This is a test comment.[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
P1[LF]
6 7000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
不正なファイル

7と次の行の0が
つながってしま
う。
例5
P1 #This is a test comment.[LF]
6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
P1 6 7[LF]
000000[LF]
011110[LF]
010000[LF]
011100[LF]
010000[LF]
010000[LF]
000000[LF]
問題なし

P1直後の
区切りコードは
[LF]でなく空白
となっている

・ ヘッダ最後の値と画像データの間は1つの「区切りコード」ということになっているが,
  2つめ以降の「区切りコード」があったとしても,それは画像データ内の無視される
  「区切りコード」と考えられ,問題ない。
・ 実際のファイルでは,意地悪なことはなく,例1のようにマジックナンバの次の行
  にコメントが置かれることが多い
・ ただし,コメント行が2行あったり,次のpgmなどでは2箇所にコメント行がある場合もある。


2.ASCII形式で保存されたグレイスケール画像ファイル (PGM)
PGM形式のファイルは次のような構成になっている。
◯ヘッダ(どのファイル形式でもここは必ずASCII形式)
 マジックナンバ「P2」
 単数または複数の「区切りコード*1」
 画像の横方向ピクセル数(画像の横幅)
 単数または複数の「区切りコード」
 画像の縦方向ピクセル数(画像の高さ)
 単数または複数の「区切りコード」
 画像の輝度の最大値
 単数の「区切りコード」
◯画像データ(ASCII形式)
 黒は0,白は正整数で輝度を表すことにして,画像の左上から右方向にグレイスケール
 輝度値を並べる。右端に達したら,左端に戻って同様に輝度値を並べ続ける。
 (正の整数の最大値は65535以下でなければなならい。通常は255が使われる)
 グレイスケール輝度値は単数または複数の「区切りコード」で区切られる。

*1 区切りコードは次のものが使われる 空白文字,CR('\r'),LF('\n'),TAB('\t')
(この他にもあるが,通常はこれらの4コードである。)
「区切りコード」で[LF]を使うとテキストエディタでは改行となり,行のイメージとなる。
この1行は70文字を超えてはならない。

例 次の3つの例はすべて「F」(黒地にグレイのグラデーションの付いたF)を表示する正当なpgmファイルである。
ヘッダには,P2形式で,幅6,高さ7,最大輝度255であることが書かれている。
WindowsOSのもとでは改行には[CR][LF]が使われるが,複数「区切りコード」が使えるのでそのままで問題ない。

             P2形式ファイルの例
(赤字の部分が区切りコードで,青字の部分が画像データ部と解釈される)
ファイル例1
ファイル例2
ファイル例3
最小ファイル形式 説明のために見やすくした例
Windows版
P2[LF]
6 7[LF]
255
[LF]

0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
P2   6   7  255[LF]
0   0   0   0   0 0[LF]
0 220 230 240 250 0[LF]
0 220   0   0   0 0[LF]
0 220 230 240   0 0[LF]
0 220   0   0   0 0[LF]
0 220   0   0   0 0[LF]
0   0   0   0   0 0[LF]
P2[CR][LF]
6 7[CR][LF]
255[CR][LF]
0 0 0 0 0 0[CR][LF]
0 220 230 240 250 0[CR][LF]
0 220 0 0 0 0[CR][LF]
0 220 230 240 0 0[CR][LF]
0 220 0 0 0 0[CR][LF]
0 220 0 0 0 0[CR][LF]
0 0 0 0 0 0[CR][LF]
このファイルをviewerで表示するとつぎのように見える。(拡大している)


コメントの挿入について
「#」で始まって[CR]か[LF]で終わるデータの並びは,コメントとして扱われ,取り除いてから読み取りが行われる。
[LF]までが取り除かれることに注意が必要である。

              コメントの取り扱い

元のファイル
コメントが取り除かれた状態
評価
例1
P2[LF]
#This is a test comment.[LF]
6 7
[LF]
255
[LF]

0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
P2[LF]
6 7[LF]
255
[LF]

0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
正当なコメント入り
ファイル
例2
P2#This is a test comment.[LF]
[LF]
6 7
[LF]
255[LF]
0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
P2[LF]
6 7[LF]
255
[LF]

0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
正当なコメント入り
ファイル
例3
P2#This is a test comment.[LF]
6 7
[LF]
255
[LF]

0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
P26 7[LF]
255
[LF]

0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
不正なファイル
P2と6が
1つの文字列になってしまう

・ ヘッダ最後の値と画像データの間は1つの「区切りコード」ということになっているが,
  2つめ以降の「区切りコード」があったとしても,それは画像データ内の「区切りコード」
  と考えられ,問題ない。
・ コメント行が2行あったり,2箇所にコメント行がある場合もある。


3.ASCII形式で保存されたRGBカラー画像ファイル (PPM)
PPM形式のファイルは次のような構成になっている。
◯ヘッダ(どのファイル形式でもここは必ずASCII形式)
 マジックナンバ「P3」
 単数または複数の「区切りコード*1」
 画像の横方向ピクセル数(画像の横幅)
 単数または複数の「区切りコード」
 画像の縦方向ピクセル数(画像の高さ)
 単数または複数の「区切りコード」
 RGBカラー画像値の最大値
 単数の「区切りコード」
◯画像データ(ASCII形式)
 画像の左上から右方向にRGBカラー画像値を並べる。右端に達したら,
 左端に戻って同様にRGBカラー画像値を並べ続ける。
 RGBカラー画像値とはR(赤)・G(緑)・B(青)の3つの値である。
 この3つの値は3つの色を表す0または正の整数である。
(正の整数の最大値は65535以下でなければなならい。通常は255が使われる。)
 255が最大値の場合では,0,0,0は黒点,255,255,255は白点,255,0,0は赤点である。
 各画像値は単数または複数の「区切りコード」で区切られる。

*1 区切りコードは次のものが使われる 空白文字,CR('\r'),LF('\n'),TAB('\t')
(この他にもあるが,通常はこれらの4コードである。)
「区切りコード」で[LF]を使うとテキストエディタでは改行となり,行のイメージとなる。
この1行は70文字を超えてはならない。

例 次の例はすべて「F」(黒地に赤のグラデーションの付いたF)を表示するppmファイルである。
ヘッダには,P3形式で,幅6,高さ7,最大輝度255であることが書かれている。
WindowsOSのもとでは改行には[CR][LF]が使われるが,複数「区切りコード」が使えるのでそのままで問題ない。
説明のために桁数を合わせたファイル例
実際には区切りは空白文字は1つだけでもよい
説明のために桁数を合わせたファイル例 Windows版
実際には区切りは空白文字は1つだけでもよい
P3[LF]
6 7[LF]
255
[LF]

0 0 0    0 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0  230 0 0  240 0 0  250 0 0  0 0 0[LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0  230 0 0  240 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0    0 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
P3[CR][LF]
6 7[CR][LF]
255
[CR][LF]
0 0 0    0 0 0    0 0 0    0 0 0    0 0 0  0 0 0[CR][LF]
0 0 0  220 0 0  230 0 0  240 0 0  250 0 0  0 0 0[CR][LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[CR][LF]
0 0 0  220 0 0  230 0 0  240 0 0    0 0 0  0 0 0[CR][LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[CR][LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[CR][LF]
0 0 0    0 0 0    0 0 0    0 0 0    0 0 0  0 0 0[CR][LF]
このファイルをviewerで表示するとつぎのように見える。(拡大している)


コメントの挿入について
「#」で始まって[CR]か[LF]で終わるデータの並びは,コメントとして扱われ,取り除いてから読み取りが行われる。
詳細はpbm,pgm参照


4.バイナリ形式で保存された白黒二値画像ファイル (PBM)
PBM形式(バイナリ)のファイルは次のような構成になっている。
◯ヘッダ(どのファイル形式でもここは必ずASCII形式)
 マジックナンバ「P4」
 単数または複数の「区切りコード*1」
 画像の横方向ピクセル数(画像の横幅)
 単数または複数の「区切りコード」
 画像の縦方向ピクセル数(画像の高さ)
 単数の「区切りコード」 *2
◯画像データ(row形式,バイナリ形式)
 黒は1,白は0で表すことにして,bitごとに画像の左上から右方向にピクセル値を並べる。
 そのため1byteに8ピクセルの情報が入る。画像の横幅が8の倍数なら都合がよいが,
 8の倍数以外の場合は,右端につかわれないbitを持ったbyteを作って,画像の右端に達する。
 左端に戻って次のbyteから同様にピクセル値を並べ続ける。

*1 区切りコードについては,P1からP3と同様である。
*2 ここに単数の「区切りコード」が必要であるため,Windows形式の[CR][LF]は使えない。

例 次の例は「F」(白地の黒のF)を3個表示するpbmファイルである。
pbm
P1形式
pbm
P4形式
pbm(P4)画像データの
ビット表現の説明
「.」のところは余白で「0」扱い
P1[LF]
18 7[LF]
000000000000000000[LF]
011110011110011110[LF]
010000010000010000[LF]
011100011100011100[LF]
010000010000010000[LF]
010000010000010000[LF]
000000000000000000[LF]
P4[LF]
18 7[LF]
[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]


0000 0000  0000 0000  00
.. ....
0111 1001  1110 0111  10.. ....
0100 0001  0000 0100  00.. ....
0111 0001  1100 0111  00.. ....
0100 0001  0000 0100  00.. ....
0100 0001  0000 0100  00.. ....
0000 0000  0000 0000  00.. ....

上記中央のpbmP4形式ファイルをバイナリエディタで見ると次のようになっている。


このファイルをviewerで表示するとつぎのように見える。(拡大している)


コメントの挿入について
「#」で始まって[CR]か[LF]で終わるデータの並びは,コメントとして扱われ,取り除いてから読み取りが行われる。
詳細はpbm(P1),pgm(P2)参照

・コメントについての注意
ヘッダの「画像の縦方向ピクセル数(画像の高さ)」の次に,単数の「区切りコード」があり,そのあとはバイナリデータになる。
そのため,ヘッダとバイナリ画像データの間にコメントを挿入する場合は注意が必要である。

              コメントの取り扱い

元のファイル
コメントが取り除かれた状態
評価
例1
P4[LF]
18 7#This is a test comment.[LF]
[LF]

[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
P4[LF]
18 7[LF]
[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
正当なコメント
入りファイル
例2
P4[LF]
18 7#This is a test comment.[LF]
[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
P4[LF]
18 7[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
不正なファイル
(*1)
例3
P4[LF]
18 7[LF]
#This is a test comment.[LF]
[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
P4[LF]
18 7[LF]
#This is a test comment.[LF]
[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
不正なファイル
(*2)

例4
P4[LF]
18 7 #This is a test comment.[LF]
[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
P4[LF]
18 7 #This is a test comment.[LF]
[0x00][0x00][0x00]
[0x79][0xe7][0x80]
[0x41][0x04][0x00]
[0x71][0xc7][0x00]
[0x41][0x04][0x00]
[0x41][0x04][0x00]
[0x00][0x00][0x00]
不正なファイル
(*3)

(*1) ヘッダ部と画像データ部の境の「単一の区切り文字」がなくなってしまった。
(*2) 「#」が7(画像高さ)の次の「単一の区切り文字」([LF])の次にあるため,
  コメント文字列が画像データとして扱われてしまう。
(*3) 「#」が7(画像高さ)の次の「単一の区切り文字」(空白)の次にあるため,
  コメント文字列が画像データとして扱われてしまう。


5.バイナリ形式で保存されたグレイスケール画像ファイル (PGM)
PGM形式(バイナリ)のファイルは次のような構成になっている。
◯ヘッダ(どのファイル形式でもここは必ずASCII形式)
   マジックナンバ「P5」
   単数または複数の「区切りコード*1」
   画像の横方向ピクセル数(画像の横幅)
  単数または複数の「区切りコード」
   画像の縦方向ピクセル数(画像の高さ)
   単数または複数の「区切りコード」
   画像の輝度の最大値
   単数の「区切りコード」 *2
◯画像データ(row形式,バイナリ形式)
 黒は0,白は正整数で輝度を表すことにして,画像の左上から右方向にグレイスケール
 輝度値を並べる。右端に達したら,左端に戻って同様に輝度値を並べ続ける。
 (正の整数の最大値は65535以下でなければなならい。通常は255が使われる)
 輝度の最大値が255以下の場合は,1ピクセルは1byteになり,
 266以上の場合は,1ピクセルは2byteになる。
 (デファクトスタンダードではビッグエンディアンになっているようだ。)

*1 区切りコードについては,P1からP4と同様である。
*2 ここに単数の「区切りコード」が必要であるため,Windows形式の[CR][LF]は使えない。

例 次の例は「F」(黒地にグレイのグラデーションの付いたF)を表示するpgmファイルである。
pgm
P2形式
pgm
P5形式
P2[LF]
6 7[LF]
255
[LF]

0 0 0 0 0 0[LF]
0 220 230 240 250 0[LF]
0 220 0 0 0 0[LF]
0 220 230 240 0 0[LF]
0 220 0 0 0 0[LF]
0 220 0 0 0 0[LF]
0 0 0 0 0 0[LF]
P5[LF]
6 7[LF]
255
[LF]

[0x00]
[0x00][0x00][0x00][0x00][0x00]
[0x00][0xdc][0xe6][0xf0][0xfa][0x00]
[0x00][0xdc][0x00][0x00][0x00][0x00]
[0x00]
[0xdc][0xe6][0xf0][0x00][0x00]

[0x00][0xdc][0x00][0x00][0x00][0x00]
[0x00][0xdc][0x00][0x00][0x00][0x00]
[0x00][0x00][0x00][0x00][0x00][0x00]

上記のpgmP5形式ファイルをバイナリエディタで見ると次のようになっている。


ここのファイルをviewerで表示するとつぎのように見える。(拡大している)


コメントの挿入について
「#」で始まって[CR]か[LF]で終わるデータの並びは,コメントとして扱われ,取り除いてから読み取りが行われる。
詳細はpbm(P1),pgm(P2)参照

・コメントについての注意は,pbm(P4)参照


6.バイナリ形式で保存されたRGBカラー画像ファイル (PPM)
PPM形式(バイナリ)のファイルは次のような構成になっている。
◯ヘッダ(どのファイル形式でもここは必ずASCII形式)
 マジックナンバ「P6」
 単数または複数の「区切りコード*1」
 画像の横方向ピクセル数(画像の横幅)
 単数または複数の「区切りコード」
 画像の縦方向ピクセル数(画像の高さ)
 単数または複数の「区切りコード」
 RGBカラー画像値の最大値
 単数の「区切りコード」 *2
◯画像データ(ASCII形式)
 画像の左上から右方向にRGBカラー画像値を並べる。右端に達したら,
 左端に戻って同様にRGBカラー画像値を並べ続ける。
 RGBカラー画像値とはR(赤)・G(緑)・B(青)の3つの値である。
 この3つの値は3つの色を表す0または正の整数である。
(正の整数の最大値は65535以下でなければなならい。通常は255が使われる。)
 255が最大値の場合では,0,0,0は黒点,255,255,255は白点,255,0,0は赤点である。
 輝度の最大値が255以下の場合は,1ピクセルの1色の値は1byteになり,
 266以上の場合は,1ピクセルの1色の値は2byteになる。
 (デファクトスタンダードではビッグエンディアンになっているようだ。)

*1 区切りコードについては,P1からP5と同様である。
*2 ここに単数の「区切りコード」が必要であるため,Windows形式の[CR][LF]は使えない。

例 次の例は「F」(黒地に赤のグラデーションの付いたF)を表示するppmファイルである。
ppm
P3形式
P3[LF]
6 7[LF]
255
[LF]

0 0 0    0 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0  230 0 0  240 0 0  250 0 0  0 0 0[LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0  230 0 0  240 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0  220 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
0 0 0    0 0 0    0 0 0    0 0 0    0 0 0  0 0 0[LF]
ppm
P6形式
データ領域で3byteごとに空白を入れて表現しているが,本物のファイルには空白はない。
(3byteでRGB1ピクセルを表している。)
P6[LF]
6 7[LF]
255
[LF]
[0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00]
[0x00][0x00][0x00] [0xdc][0x00][0x00] [0xe6][0x00][0x00] [0xf0][0x00][0x00] [0xfa][0x00][0x00] [0x00][0x00][0x00]
[0x00][0x00][0x00] [0xdc][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00]
[0x00][0x00][0x00] [0xdc][0x00][0x00] [0xe6][0x00][0x00] [0xf0][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00]
[0x00][0x00][0x00] [0xdc][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00]
[0x00][0x00][0x00] [0xdc][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00]
[0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00] [0x00][0x00][0x00]
このファイルをviewerで表示するとつぎのように見える。(拡大している)


コメントの挿入について
「#」で始まって[CR]か[LF]で終わるデータの並びは,コメントとして扱われ,取り除いてから読み取りが行われる。
詳細はpbm(P1),pgm(P2)参照

・コメントについての注意は,pbm(P4)参照