Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【解説】PNMのフォーマット + viewer

Last updated at Posted at 2025-03-12

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 01のASCIIだけで構成。
0は白,1は黒。
各ASCIIの前後には0つ以上の区切り文字。
データの格納順番は,画像の左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 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 画像の各行ごとに,011ビットのバイナリが順に並んだデータ構造(つまり1バイト中には8つのデータが並ぶ)。
各行の最後の1バイトが8ビットで埋まらない場合(つまり幅が8の倍数ではない場合),空いているビットを適当に埋める。例えば,ある行のデータが01101であった場合,その行のデータ数は5ビットになるので,適当に8-5=3ビットを追加して01101000(最後の000が適当に埋めた3ビット)のようにする。
ビット数合わせのために各行の最後の1バイト中に追加した適当なビットは一切使われない。
0は白,1は黒。
データの格納順番は,左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 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つ分がずれるだけではなく,ビット数合わせ用に適当に埋めたビットも画像に反映されてしまいます。

サンプル画像(P1と同様のもの,かなり拡大したもの)。

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 2 3 4
5 6 7 8
9 10 11 12
13 14 15 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と違い,01で構成はされていないため画像データの概形を掴むのは難しいです。

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 2 3 4
5 6 7 8
9 10 11 12
13 14 15 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]もラスターデータの一部として処理されてしまいます。

テキストエディタ等で編集する際,改行コードには注意してください。
CRLF(CRとLFがセットで改行する)だと,

P5[CR][LF]
20 10[CR][LF]
[ラスター(バイナリ)データ]

このようになり,1つ上の注意事項と同じように,10直後の[CR]が区切り文字として処理され,ラスターデータ直前の[LF]もラスターデータの一部として処理されてしまいます。
改行コードはLFにしましょう。
実際,本注意部の下に示すサンプル画像の改行コードをCRLFにした場合,以下のようになりました。

サンプル画像(P2と同様のもの,かなり拡大したもの)。

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=255G=0B=0 で赤の量100%,緑の量0%,青の量0%なのでこのピクセルは純な赤色である。0 0 0は黒,255 255 255は白。
各値の前後には1つ以上の区切り文字。
データの格納順番は,画像の左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 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と違い,01で構成はされていないため画像データの概形を掴むのは難しいです。

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=255G=0B=0 で赤の量100%,緑の量0%,青の量0%なのでこのピクセルは純な赤色である。0 0 0は黒,255 255 255は白。
データの格納順番は,左上から右下に向かって,上から下,左から右へと格納していく(以下の表で1から16を辿るように)。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 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]もラスターデータの一部として処理されてしまいます。

テキストエディタ等で編集する際,改行コードには注意してください。
CRLF(CRとLFがセットで改行する)だと,

P6[CR][LF]
20 10[CR][LF]
[ラスター(バイナリ)データ]

このようになり,1つ上の注意事項と同じように,10直後の[CR]が区切り文字として処理され,ラスターデータ直前の[LF]もラスターデータの一部として処理されてしまいます。
改行コードはLFにしましょう。
実際,本注意部の下に示すサンプル画像の改行コードをCRLFにした場合,以下のようになりました。

サンプル画像(P3と同様のもの,かなり拡大したもの)。

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となっており,一致しているのが確認できると思います。

参考文献

本記事は公式ドキュメントを日本語にして内容を噛み砕いたものです。


間違い,理解しにくい点がありましたらコメント・編集リクエストで教えていただけると幸いです。

ビューワーを公開しました

PNMファイルはGIMP等で開きますが,ちょっと編集して再度表示,という使い方には向いていません。そのため,手軽にPNMを表示することができ,上で紹介した最新の仕様に沿って動作する,PNMビューワーを作ってみました。
以下のリンクから試してみてください。
(表示画像を右クリックでpngで保存(変換)できますが,これは全く意図したものではなく,偶然の産物です)

  1. 画像本体となるデータ群のこと。 2 3 4 5 6

  2. 1バイトは8ビット。1ビットは0か1の2択で表すので,1バイト(8ビット)で表せる値の個数(組み合わせ)は2^8 = 256個で,0~255を表せます。よって,最大輝度が256未満なら1バイトで表せるというわけです。 2

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?