PNM形式概説
1.概 要
PNM形式は,以下のファイル形式の総称である.
- PBM(Portable Bitmap File Format):2値画像を表現する
- PGM(Portable Graymap File Format):濃淡画像を表現する
- PPM(Portable Pixmap File Format):カラー画像を表現する
上記はそれぞれ,各画素の値(データ)を文字列で書き込むもの(アスキー形式)と,ビット列で書き込むもの(バイナリ形式)の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 |
9 | 10 |
11 | 12 |
13 | 14 |
15 | 16 |
17 | 18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 | 26 |
27 | 28 |
29 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 | 44 |
45 | 46 |
47 | 48 |
49 | 50 |
51 | 52 |
53 | 54 |
55 | 56 |
57 | 58 |
59 | 60 |
61 | 62 |
63 | 64 |
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バイナリ各形式のファイルの例を示す.ここで用いている画像の画素数等は次の通りである.
- 縦縞の本数: 8
- 縦縞の幅 : 14[pixel]
- 横画素数 :112[pixel]
- 縦画素数 : 50[pixel]
表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
|
|
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
|
|
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
|
|
表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
|
|
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
|
|
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
|
|