PNMとは、"Portable aNy Map"の略であり、PPM(Portable Pix Map)、PGM(Portable Gray Map)、PBM(Portable Bit Map)の総称。それぞれ、フルカラー、グレースケール、そして、2値画像を扱う。いずれの画像形式も共通の仕様のヘッダの後に、画素値を記述する。
先頭から、以下に示す順で構成する。
データ | 情報 | 参考 |
---|---|---|
Pn | 画像データ仕様 | 固定長文字列(2バイト) 'P'に続けて数字nを記述する。このとき1≦n≦6 |
'#'で始まる文字列 | 255バイト以内のコメント | 不定長文字列 |
col_size row_size | 画像の横方向のサイズ 画像の縦方向のサイズ | 不定長文字列。両データの区切りには、スペースを用いる。 |
qmax | 量子化レベルの最大値 | 不定長文字列 |
l(r, c) = f(r, c) * 255/qmax
画像データは、ヘッダの直後に記述する。 画素値のデータは画像の左から右、上から下の順で記述する。
いずれの形式も、8bit値(0~255)で画素値を表す。なおアスキー形式(テキストファイル)のファイルオープンはバイナリ形式でも問題なく動作する。
2値画像、およびグレースケール画像のデータは濃度のみであり、座標(縦, 横)=(r,c)の画素値をf(0,0)であらわすとき、 1番目の画像データは、座標(0,0)の画素値f(0,0)である。
プログラミングにおいて画素値を配列(メモリ)上に格納する場合、濃度を、f(r,c) とすると、モノクロ画像のデータは先頭から
f(0,0), f(0,1), f(0,2), …
のように記述している。
カラー画像のデータは、光の三原色それぞれについてデータの記述が必要である。このとき、座標(r,c)のデータは、三原色それぞれの強度を{赤、緑、青}の順番に記述する。赤、緑、青の強度を、それぞれr(r,c), g(r,c), b(r,c)とすると、 カラー画像ファイルのデータは、先頭から
r(0,0), g(0,0), b(0,0), r(0,1), g(0,1), b(0,1), r(0,2), …
のように記述している。
以下に示すサンプル・ソースは、引数によってモノクロ画像の濃度、カラー画像の R ,G, B のいずれかを返すプログラムである。RGBすべてを取得する場合は、引数を変えて3回実行する必要があることに注意。
簡単のため、画像データを格納する配列は、[col_size][row_size]の2次元ではなく[col_size * row_size]の1次元で取得している。座標(縦, 横)=(r,c)を格納する要素番号は、2次元配列の場合[r][c]であるが、1次元配列の場合は[r * col_size + c]となる。