このページの説明には一部誤りが有ることが分かっています。
PNM(PPM/PGM/PBM)形式について、改めて書き直しています。以下を参照ください。

画像ファイルの扱い方 (2) -PPM/PGM/PBM形式 (1)

作成:

まず最初に PPM/PGM/PBM (Portable Pixel/Grey/Bit Map) 形式から説明したいと思います。 (私が知ってるのは PPM/PGM/PBM 形式と BMP 形式だけなので簡単なほうからということで)
一般にはあまり知られていない形式かもしれませんが、 UNIX などで標準的な画像形式として使われています。 この形式のファイルを UNIX 以外の OS で開くには、それに対応した特別なアプリケーションが必要です。
この形式の特徴は画像データ部にバイナリ (raw) 形式とテキスト (ascii) 形式の2つのモードがあり、 ファイルヘッダ(画像の大きさなどの情報が書かれている部分)がテキスト形式であるということです。 テキスト形式のヘッダを持っているということはヘッダ長がバイナリ的に不定であるということで バイナリ形式のデータを格納するデータファイルの形式としてはめずらしい形をしています。

それではファイルフォーマットですが、

<<ファイル形式識別記号>>\n
#<<コメント>>\n
<<x方向のピクセル数>> <<y方向のピクセル数>>\n
<<最大輝度>>\n
<<画像データ(RGB順、左から右、上から下へ走査した順)>>

という構成になっています。 \n は改行(ラインフィード)を示しています。
ちょっと注意してほしいのは、同じ改行でも Windows の \r\n (キャリッジリターン+ラインフィード)や、 Mac の \r (キャリッジリターン)ではだめで、 UNIX の改行コードである \n で改行しないといけないということです。
UNIX 系列の OS であれば特に気にしなくてもよいのですが、他の OS で使うときは ファイルオープンのときにバイナリモードでオープンし \n を出力するようにしてください。 テキストモードでオープンしてしまうと、うまくいかず悩むことになります。(私も悩みました・・・)
それではそれぞれの要素の説明をします。

ファイルヘッダ

ヘッダ記号形式 拡張子
P12値 ascii形式 PBM形式
P2グレースケール ascii形式PGM形式
P3フルカラー ascii形式 PPM形式
P42値 raw形式 PBM形式
P5グレースケール raw形式 PGM形式
P6フルカラー raw形式 PPM形式

まず、ファイル形式識別記号ですが、P の後に数字をつけた2文字の記号で どのように画像データの形式を記録しているのかを見分けています。 形式と記号の対応は上の表のようになっています。
ちなみに、 acsii 形式とはいわゆる文字列で、これはエディタなので開くと人間が読める形式になっています。 例えば 10 という値は "10" という文字列で表されます。 それに対し、 raw 形式とはいわゆるバイナリ形式です。(C言語的にいうと getc 等で直接読み込める形?うまい説明が見つからない)
フルカラーが PPM 形式(拡張子 .ppm)でグレースケールがPGM形式(拡張子.pgm)、 モノクロが PBM 形式(拡張子 .pbm)となっており、ファイルの拡張子が違います。 しかし、拡張子は .ppm で統一してもかまわないようです。 (読みこむときはどの拡張子でも開けるようにして、書き出すときは正規の拡張子にするというのが正しい姿勢でしょう。)

ファイルヘッダにはコメントをいれることができます。
ヘッダの範囲に「#」で始まる行はコメントとして無視されます (当然のことですが、行というのは前の改行コードから次の改行コードの間です。 バイナリ的に考えていると混乱しがちです。) 一般的には、ファイル形式識別記号の後に来るようです。 書き出すときは特に意識しなくてもいいのですが、 読みこむときにはこれを読み飛ばすような工夫が必要です。

ピクセル数はそのまま数字で書きこむだけです。

最大輝度ですがこれは2値形式で記録するときは必要ありません。
フルカラーとグレースケールでは普通は255になっていますが、 これより小さい値を指定することもできます。 しかし、これによる圧縮の効果はありません。 また、255以上の数字を指定しても一般に出力できないので無意味です。 (一部プロフェッショナル向けの画像処理ソフトには 内部で各色8bit以上で扱って演算誤差を少なくする機能もありますがここでは気にしない) ビューワによっては読みこめなくなるようなので、実質的には1~255と考えてください。

以上がファイルヘッダの内容ですが、例として GIMP で作成した PPM ファイルのヘッダ部分を示します。

P6
# CREATOR: The GIMP's PNM Filter Version 1.0
1281 1025
255

このヘッダから読み取れるのは、まずファイル形式はP6だからフルカラーraw形式、 次にあるのがコメントでGIMPで作成したことが記録されています。この情報は別に利用する必要はありません。 次は画像サイズで横 1281 pixel 縦 1025 pixel のサイズです。そして最大輝度は 255 である。 ということです。

画像データ

次はいよいよ肝心のデータ部分です。
まずテキスト (ascii) 形式の場合、 RGB の順にその数値を表す文字列を出力します。 区切り文字はスペース、タブ、改行のどれでもかまわないようです。 GIMP の出力ファイルを見ると区切りはすべて改行で、 Paint Shop Pro の出力ファイルではスペースを区切りにして、 定期的に改行しているようです。
次にバイナリ (raw) 形式の場合、 RGB 順にバイナリデータを出力していきます。 モノクロの場合、 1bit 1ピクセル( 1 が黒 0 が白、モノクロ以外は 0 が黒だが逆になっているので注意)で出力しますが、 横方向の走査が8の倍数区切りになるように適当な値をパディングします。

と、説明してきましたが、私の下手な説明ではよく分からないでしょうから、 具体的な書き出し、読みこみのコードを次回、示したいと思います。