PNMという画像をご存知でしょうか。
データ構造が非常にシンプルで,プログラミング演習としてちょっとした画像生成をするのにも向いています。
本記事ではPNMの2025年3月時点で最新のデータ仕様に関してまとめます。
共通事項が複数ありますが,情報の散らばりをなくすために同じことでも略すことなく記載します。
PNMの種類
PNMには大きく6種類あり,それらはマジックナンバー(P数字
と表記されるもの)で区別されます。
マジックナンバー | タイプ | タイプ略 | エンコード |
---|---|---|---|
P1 | Portable bitmap | PBM | ASCII |
P2 | Portable graymap | PGM | ASCII |
P3 | Portable pixmap | PPM | ASCII |
P4 | Portable bitmap | PBM | Binary |
P5 | Portable graymap | PGM | Binary |
P6 | Portable pixmap | PPM | Binary |
(表参考:Wikipedia)
PBM
マジックナンバーがP1
またはP4
のものはPBMで,黒と白の二値画像です。ですので,データは0と1だけで保存されます。
P1
<データフォーマット>
項目 | 中身 | 備考 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | P1 |
ASCII文字。 | ||||||||||||||||
2 | 1つ以上の区切り文字 | 区切り文字とは, 空白,タブ(TAB),復帰(CR),改行(LF) のこと。 |
||||||||||||||||
3 | 画像の幅 | 10進数で,ASCII文字で表記。 | ||||||||||||||||
4 | 1つ以上の区切り文字 | |||||||||||||||||
5 | 画像の高さ | 10進数で,ASCII文字で表記。 | ||||||||||||||||
6 | 1つのみの区切り文字 | 通常は改行(LF)が入る。 | ||||||||||||||||
7 | ラスターデータ1 |
0 か1 のASCIIだけで構成。0 は白,1 は黒。各ASCIIの前後には0つ以上の区切り文字。 データの格納順番は,画像の左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
|
||||||||||||||||
1~5の前後 | コメント |
'#' から次の復帰(CR)・改行(LF)・EOF手前までの任意の文字群はコメントとして扱い,無視する(CR,LF,EOFはコメントに含まない)。2024年6月以前は復帰(CR)・改行(LF)・EOFもコメントの一部として無視する仕様になっていた。 コメントを取り除いた結果,ヘッダー部が項目1〜6に沿ったフォーマットになっていれば良い。 |
||||||||||||||||
7の後 | ジャンク | ラスターデータの後は空白文字で始まっていれば,好きなジャンクを置くことができる。 | ||||||||||||||||
全項目 | ファイルの各行は70文字を超えてはならない。 |
上のデータフォーマット表の項目6にて,区切り文字は「1つのみ」とありますが,実際は2つ以上あっても問題ありません。
2つ以上あった場合,2つ目以降の区切り文字はラスターデータ(項目7)中の
各ASCIIの前後には0つ以上の区切り文字
に属するためです。
P1
はエンコードがASCIIであるので,ファイルの中身を直接見ることができます。
P1
20 10
# this is PBM
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
上のデータフォーマット表に沿っていれば良いので,極論,以下のようなデータであっても問題ありません。
P1 20
10
# this is PBM
000 011110 00011110000
111 1000011110000 1111
...
文字列検索で0または1を染めてみるとラスター部からどのような画像であるのかが想像がつきます。
P4
<データフォーマット>
項目 | 中身 | 備考 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | P4 |
ASCII文字。 | ||||||||||||||||
2 | 1つ以上の区切り文字 | 区切り文字とは, 空白,タブ(TAB),復帰(CR),改行(LF) のこと。 |
||||||||||||||||
3 | 画像の幅 | 10進数で,ASCII文字で表記。 | ||||||||||||||||
4 | 1つ以上の区切り文字 | |||||||||||||||||
5 | 画像の高さ | 10進数で,ASCII文字で表記。 | ||||||||||||||||
6 | 1つのみの区切り文字 | 通常は改行(LF)が入る。 | ||||||||||||||||
7 | ラスターデータ1 |
画像の各行ごとに,0 か1 の1ビットのバイナリが順に並んだデータ構造(つまり1バイト中には8つのデータが並ぶ)。各行の最後の1バイトが8ビットで埋まらない場合(つまり幅が8の倍数ではない場合),空いているビットを適当に埋める。例えば,ある行のデータが 01101 であった場合,その行のデータ数は5ビットになるので,適当に8-5=3ビットを追加して01101000 (最後の000 が適当に埋めた3ビット)のようにする。ビット数合わせのために各行の最後の1バイト中に追加した適当なビットは一切使われない。 0 は白,1 は黒。データの格納順番は,左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
|
||||||||||||||||
1~5の前後 | コメント |
'#' から次の復帰(CR)・改行(LF)・EOF手前までの任意の文字群はコメントとして扱い,無視する(CR,LF,EOFはコメントに含まない)。2024年6月以前は復帰(CR)・改行(LF)・EOFもコメントの一部として無視する仕様になっていた。 コメントを取り除いた結果,ヘッダー部が項目1〜6に沿ったフォーマットになっていれば良い。 |
1つのみの区切り文字(項目6)前(=項目5の後)までコメントを入れることができますが,以下のような場合は,注意が必要です([LF]は改行コード(\n)を明記したもの)。
P4[LF]
20 10[LF]
# this is PBM[LF]
[ラスター(バイナリ)データ]
このデータからコメントを取り除くと以下のようになります。
P4[LF]
20 10[LF]
[LF]
[ラスター(バイナリ)データ]
これは,画像の高さ(項目5)10
直後の[LF]
が区切り文字として処理され,それ以降はラスターデータとして認識されます。つまりラスターデータ直前の[LF]
もラスターデータの一部として処理されてしまいます。
テキストエディタ等で編集する際,改行コードには注意してください。
CRLF(CRとLFがセットで改行する)だと,
P4[CR][LF]
20 10[CR][LF]
[ラスター(バイナリ)データ]
このようになり,1つ上の注意事項と同じように,10
直後の[CR]
が区切り文字として処理され,ラスターデータ直前の[LF]
もラスターデータの一部として処理されてしまいます。
改行コードはLFにしましょう。
実際,本注意部の下に示すサンプル画像の改行コードをCRLFにした場合,以下のようになりました。画像の幅が8の倍数ではないため,[LF]の1つ分がずれるだけではなく,ビット数合わせ用に適当に埋めたビットも画像に反映されてしまいます。
P4
はエンコードがBinaryであるので,ファイルの中身を直接見ることができません。普通のエディタでファイルの中身を開いても画像データの概形を掴むことはできません。
ここで,VSCodeの拡張機能 Hex Editor 等を用いて少し中身を見てみましょう。
0x08 が[LF]に相当するASCIIコードで,これがデータフォーマット表の項目6に相当します。よって,0x09(青い部分)以降がラスターデータとなります。
0x09に関して,Data Inspectorのbinaryを見ると,00001111
となっているのがわかると思います。これは,白白白白黒黒黒黒
の部分です。実際,P1で示したサンプル画像の中身を見るとラスターデータの最初の部分は0 0 0 0 1 1 1 1
となっており,一致しているのが確認できると思います。
PGM
マジックナンバーがP2
またはP5
のものはPGMで,グレースケール画像です。
P2
<データフォーマット>
項目 | 中身 | 備考 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | P2 |
ASCII文字。 | ||||||||||||||||
2 | 1つ以上の区切り文字 | 区切り文字とは, 空白,タブ(TAB),復帰(CR),改行(LF) のこと。 |
||||||||||||||||
3 | 画像の幅 | 10進数で,ASCII文字で表記。 | ||||||||||||||||
4 | 1つ以上の区切り文字 | |||||||||||||||||
5 | 画像の高さ | 10進数で,ASCII文字で表記。 | ||||||||||||||||
6 | 1つ以上の区切り文字 | |||||||||||||||||
7 | データ中の最大輝度(グレー値) | 10進数で,ASCII文字で表記。 0超65536未満である必要がある。 |
||||||||||||||||
8 | 1つのみの区切り文字 | 通常は改行(LF)が入る。 | ||||||||||||||||
9 | ラスターデータ1 | 0 (0 )から最大輝度(項目7)までの10進数を,ASCII文字で表記したデータで構成。0 が黒(#000),最大輝度が白(#FFF)。各値の前後には1つ以上の区切り文字。 データの格納順番は,画像の左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
|
||||||||||||||||
1~7の前後 | コメント |
'#' から次の復帰(CR)・改行(LF)・EOF手前までの任意の文字群はコメントとして扱い,無視する(CR,LF,EOFはコメントに含まない)。2024年6月以前は復帰(CR)・改行(LF)・EOFもコメントの一部として無視する仕様になっていた。 コメントを取り除いた結果,ヘッダー部が項目1〜8に沿ったフォーマットになっていれば良い。 |
||||||||||||||||
全項目 | ファイルの各行は70文字を超えてはならない。 |
上のデータフォーマット表の項目8にて,区切り文字は「1つのみ」とありますが,実際は2つ以上あっても問題ありません。
2つ以上あった場合,2つ目以降の区切り文字はラスターデータ(項目9)中の
各値の前後には1つ以上の区切り文字
に属するためです。
PBMのドキュメントにはラスターデータの後にはジャンクを置いても良いと明記されていますが,PGMのドキュメントには明記されていません(ですがおそらくジャンクを置いても問題ないと思います)。
P2
はエンコードがASCIIであるので,ファイルの中身を直接見ることができます。
しかしPBMと違い,0
か1
で構成はされていないため画像データの概形を掴むのは難しいです。
P2
20 10
50
# this is PGM
10 10 10 10 0 0 0 0 30 30 30 30 0 0 0 0 50 50 50 50
0 0 0 0 20 20 20 20 0 0 0 0 40 40 40 40 0 0 0 0
10 10 10 10 0 0 0 0 30 30 30 30 0 0 0 0 50 50 50 50
0 0 0 0 20 20 20 20 0 0 0 0 40 40 40 40 0 0 0 0
10 10 10 10 0 0 0 0 30 30 30 30 0 0 0 0 50 50 50 50
0 0 0 0 20 20 20 20 0 0 0 0 40 40 40 40 0 0 0 0
10 10 10 10 0 0 0 0 30 30 30 30 0 0 0 0 50 50 50 50
0 0 0 0 20 20 20 20 0 0 0 0 40 40 40 40 0 0 0 0
10 10 10 10 0 0 0 0 30 30 30 30 0 0 0 0 50 50 50 50
0 0 0 0 20 20 20 20 0 0 0 0 40 40 40 40 0 0 0 0
上のデータフォーマット表に沿っていれば良いので,極論,以下のようなデータであっても問題ありません。
P2 20
10
50
# this is PGM
10 10 10 10 0 0 0 0 30 30 30 30 0 0 0 0 50 50 50 50
0 0 0 0 20 20 20 20 0 0 0 0 40 40 40 40 0 0 0 0
...
P5
<データフォーマット>
項目 | 中身 | 備考 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | P5 |
ASCII文字。 | ||||||||||||||||
2 | 1つ以上の区切り文字 | 区切り文字とは, 空白,タブ(TAB),復帰(CR),改行(LF) のこと。 |
||||||||||||||||
3 | 画像の幅 | 10進数で,ASCII文字で表記。 | ||||||||||||||||
4 | 1つ以上の区切り文字 | |||||||||||||||||
5 | 画像の高さ | 10進数で,ASCII文字で表記。 | ||||||||||||||||
6 | 1つ以上の区切り文字 | |||||||||||||||||
7 | データ中の最大輝度(グレー値) | 10進数で,ASCII文字で表記。 0超65536未満である必要がある。 |
||||||||||||||||
8 | 1つのみの区切り文字 | 通常は改行(LF)が入る。 | ||||||||||||||||
9 | ラスターデータ1 | 0から最大輝度(項目7)までの10進数を,バイナリで順に並べたデータで構成。 最大輝度(項目7)が256未満の場合,各値1バイト,それ以外の場合は各値2バイトを使う2。2バイトを使う場合,最上位バイトが先頭に来るようにする(ビッグエンディアン)。 0が黒(#000),最大輝度が白(#FFF)。 データの格納順番は,左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
|
||||||||||||||||
1~7の前後 | コメント |
'#' から次の復帰(CR)・改行(LF)・EOF手前までの任意の文字群はコメントとして扱い,無視する(CR,LF,EOFはコメントに含まない)。2024年6月以前は復帰(CR)・改行(LF)・EOFもコメントの一部として無視する仕様になっていた。 コメントを取り除いた結果,ヘッダー部が項目1〜6に沿ったフォーマットになっていれば良い。 |
1つのみの区切り文字(項目8)前(=項目7の後)までコメントを入れることができますが,以下のような場合は,注意が必要です([LF]は改行コード(\n)を明記したもの)。
P5[LF]
20 10[LF]
# this is PGM[LF]
[ラスター(バイナリ)データ]
このデータからコメントを取り除くと以下のようになります。
P5[LF]
20 10[LF]
[LF]
[ラスター(バイナリ)データ]
これは,画像の高さ(項目5)10
直後の[LF]
が区切り文字として処理され,それ以降はラスターデータとして認識されます。つまりラスターデータ直前の[LF]
もラスターデータの一部として処理されてしまいます。
P5
はエンコードがBinaryであるので,ファイルの中身を直接見ることができません。普通のエディタでファイルの中身を開いても画像データの概形を掴むことはできません。
ここで,VSCodeの拡張機能 Hex Editor 等を用いて少し中身を見てみましょう。
0x0B が[LF]に相当するASCIIコードで,これがデータフォーマット表の項目8に相当します。よって,0x0C(青い部分)以降がラスターデータとなります。
0x0Cに関して,Data Inspectorのunit8を見ると,10
(=16*0+10)となっているのがわかると思います。これは,画像データの左上の輝度が10
だということです。実際,P2で示したサンプル画像の中身を見るとラスターデータの最初の部分は10
となっており,一致しているのが確認できると思います。
PPM
マジックナンバーがP3
またはP6
のものはPPMで,カラー画像です。
P3
<データフォーマット>
項目 | 中身 | 備考 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | P3 |
ASCII文字。 | ||||||||||||||||
2 | 1つ以上の区切り文字 | 区切り文字とは, 空白,タブ(TAB),復帰(CR),改行(LF) のこと。 |
||||||||||||||||
3 | 画像の幅 | 10進数で,ASCII文字で表記。 | ||||||||||||||||
4 | 1つ以上の区切り文字 | |||||||||||||||||
5 | 画像の高さ | 10進数で,ASCII文字で表記。 | ||||||||||||||||
6 | 1つ以上の区切り文字 | |||||||||||||||||
7 | データ中の最大カラー値 | 10進数で,ASCII文字で表記。 0超65536未満である必要がある。 |
||||||||||||||||
8 | 1つのみの区切り文字 | 通常は改行(LF)が入る。 | ||||||||||||||||
9 | ラスターデータ1 | 各ピクセルのRGB (赤緑青の順)の3つの値の組を順に並べたデータ構造で,各値は0 (0 )から最大カラー値(項目7)までの10進数を,ASCII文字で表記したもの。各値に関して, 0 がその色の成分なし,最大カラー値だとその色の成分をMAXまで配分ということになる。例えば,最大カラー値が255 のもと,あるピクセルのデータが255 0 0 であれば,R=255,G=0,B=0 で赤の量100%,緑の量0%,青の量0%なのでこのピクセルは純な赤色である。0 0 0 は黒,255 255 255 は白。各値の前後には1つ以上の区切り文字。 データの格納順番は,画像の左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
|
||||||||||||||||
1~7の前後 | コメント |
'#' から次の復帰(CR)・改行(LF)・EOF手前までの任意の文字群はコメントとして扱い,無視する(CR,LF,EOFはコメントに含まない)。2024年6月以前は復帰(CR)・改行(LF)・EOFもコメントの一部として無視する仕様になっていた。 コメントを取り除いた結果,ヘッダー部が項目1〜8に沿ったフォーマットになっていれば良い。 |
||||||||||||||||
全項目 | ファイルの各行は70文字を超えてはならない。 |
上のデータフォーマット表の項目8にて,区切り文字は「1つのみ」とありますが,実際は2つ以上あっても問題ありません。
2つ以上あった場合,2つ目以降の区切り文字はラスターデータ(項目9)中の
各値の前後には1つ以上の区切り文字
に属するためです。
PBMのドキュメントにはラスターデータの後にはジャンクを置いても良いと明記されていますが,PGMのドキュメントには明記されていません(ですがおそらくジャンクを置いても問題ないと思います)。
P3
はエンコードがASCIIであるので,ファイルの中身を直接見ることができます。
しかしPBMと違い,0
か1
で構成はされていないため画像データの概形を掴むのは難しいです。
P3
20 10
50
# this is PPM
50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50
50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50
50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50
50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50
50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50
50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50
50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50
50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50
50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 0 0 50 0 0 50 0 0 50
50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 0 50 50 0 50 50 0 50 50 0 50
上のデータフォーマット表に沿っていれば良いので,極論,以下のようなデータであっても問題ありません。
P3 20 10 50
# this is PPM
50 0 0 50 0 0 50 0 0 50 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 50 0 0 50 0 0 50 0 0 50 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 50 0 0 50 0 0 50 0 0 50
...
P6
<データフォーマット>
項目 | 中身 | 備考 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | P6 |
ASCII文字。 | ||||||||||||||||
2 | 1つ以上の区切り文字 | 区切り文字とは, 空白,タブ(TAB),復帰(CR),改行(LF) のこと。 |
||||||||||||||||
3 | 画像の幅 | 10進数で,ASCII文字で表記。 | ||||||||||||||||
4 | 1つ以上の区切り文字 | |||||||||||||||||
5 | 画像の高さ | 10進数で,ASCII文字で表記。 | ||||||||||||||||
6 | 1つ以上の区切り文字 | |||||||||||||||||
7 | データ中の最大輝度 | 10進数で,ASCII文字で表記。 0超65536未満である必要がある。 |
||||||||||||||||
8 | 1つのみの区切り文字 | 通常は改行(LF)が入る。 | ||||||||||||||||
9 | ラスターデータ1 | 各ピクセルのRGB (赤緑青の順)の3つの値の組を順に並べたデータ構造で,各値は0 (0 )から最大カラー値(項目7)までの10進数を,バイナリで並べたもの。最大カラー値(項目7)が256未満の場合,各値1バイト,それ以外の場合は各値2バイトを使う2。2バイトを使う場合,最上位バイトが先頭に来るようにする(ビッグエンディアン)。 各値に関して, 0 がその色の成分なし,最大カラー値だとその色の成分をMAXまで配分ということになる。例えば,最大カラー値が255 のもと,あるピクセルのデータが255 0 0 であれば,R=255,G=0,B=0 で赤の量100%,緑の量0%,青の量0%なのでこのピクセルは純な赤色である。0 0 0 は黒,255 255 255 は白。データの格納順番は,左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
|
||||||||||||||||
1~7の前後 | コメント |
'#' から次の復帰(CR)・改行(LF)・EOF手前までの任意の文字群はコメントとして扱い,無視する(CR,LF,EOFはコメントに含まない)。2024年6月以前は復帰(CR)・改行(LF)・EOFもコメントの一部として無視する仕様になっていた。 コメントを取り除いた結果,ヘッダー部が項目1〜6に沿ったフォーマットになっていれば良い。 |
1つのみの区切り文字(項目8)前(=項目7の後)までコメントを入れることができますが,以下のような場合は,注意が必要です([LF]は改行コード(\n)を明記したもの)。
P6[LF]
20 10[LF]
# this is PPM[LF]
[ラスター(バイナリ)データ]
このデータからコメントを取り除くと以下のようになります。
P6[LF]
20 10[LF]
[LF]
[ラスター(バイナリ)データ]
これは,画像の高さ(項目5)10
直後の[LF]
が区切り文字として処理され,それ以降はラスターデータとして認識されます。つまりラスターデータ直前の[LF]
もラスターデータの一部として処理されてしまいます。
P6
はエンコードがBinaryであるので,ファイルの中身を直接見ることができません。普通のエディタでファイルの中身を開いても画像データの概形を掴むことはできません。
ここで,VSCodeの拡張機能 Hex Editor 等を用いて少し中身を見てみましょう。
0x0B が[LF]に相当するASCIIコードで,これがデータフォーマット表の項目8に相当します。よって,0x0C(青い部分)以降がラスターデータとなります。
0x0Cに関して,Data Inspectorのunit8を見ると,50
(=16*3+2)となっているのがわかると思います。これは,画像データの左上のR(赤)成分が50
だということです。この画像データの最大カラー値は50ですので,赤の量はMAXとなります。同様に,0x0D, 0x0Eは10進数で0
と,画像データの左上の緑の量,青の量はともに0となります。よって,(0x0C, 0x0D, 0x0E) = (50, 0, 0)
で,このピクセルは純な赤色だとわかります。実際,P3で示したサンプル画像の中身を見るとラスターデータの最初の部分は50 0 0
となっており,一致しているのが確認できると思います。
参考文献
本記事は公式ドキュメントを日本語にして内容を噛み砕いたものです。
- https://netpbm.sourceforge.net/doc/pbm.html
- https://netpbm.sourceforge.net/doc/pgm.html
- https://netpbm.sourceforge.net/doc/ppm.html
- https://coskxlabsite.stars.ne.jp/html/for_students/PNM/pnmfiles.html
間違い,理解しにくい点がありましたらコメント・編集リクエストで教えていただけると幸いです。
ビューワーを公開しました
PNMファイルはGIMP等で開きますが,ちょっと編集して再度表示,という使い方には向いていません。そのため,手軽にPNMを表示することができ,上で紹介した最新の仕様に沿って動作する,PNMビューワーを作ってみました。
以下のリンクから試してみてください。
(表示画像を右クリックでpngで保存(変換)できますが,これは全く意図したものではなく,偶然の産物です)