以前説明したことがある画像形式だが、改めて説明しようと思う。この形式は名前がちょっと複雑なことになっている。格納する形式によって、呼び名が異なっている。いう区別になっている。アルファチャンネルには対応していない。拡張子もそれぞれ.ppm/.pgm/.pbmと分かれているのが通常だ。全部を合わせた、pnmという拡張子もあるにはあるが、私はあまり見かけたことはない。画像形式自体がこのツールとともに作られていった経緯から、Netpbm形式などと呼ばれることもある。Map)というフォーマットがある。こちらはアルファチャンネルにも対応している。「プレーンテキスト」の画像形式として提唱されたところから始まっている。テキストエディタさえあれば読み書き編集が可能な形式である。初級者にも非常にわかりやすく、学習にはぴったりである。どのぐらい分かりやすいか以下のデータを見て欲しい。PBM形式の一例である。1どのような画像かわざわざ説明しなくても予想ができると思うが、以下にこれを拡大してpngに変換した画像を示す。実際、このPBMファイルは画像編集ソフトで作ったわけではなく、私がテキストエディタで入力して作ったものだ。コピーアンドペーストでテキストエディタに入力し拡張子を.pbmとして保存すれば画像ファイルとして通用する。ファイル入出力あたりまで進んでいれば、なんとなくどうすればこのデータの読み書きができるか想像できるだろう。最初に取り上げた理由が分かっていただけたと思う。扱おうと思うと別途ソフトをインストールする必要がある。確実なのはGIMPだろう。オープンソースで無料で使えるし、最近はWindows用のバイナリも公式で配布してくれているので特に苦労せずに使えるはずだ。Proも対応していたので紹介しておく。UNIX系のOSでは普通に使われる画像形式なので、画像を扱うためのツール群の多くは標準でサポートしているだろう。必要ならGIMPを使えばよい。-ヘッダ-具体的な画像形式について説明していく。最終的にはこちらのドキュメントを参照してもらった方が良いだろう。全てテキストでは効率が悪すぎるので、バイナリで格納するモードも持っている。このバイナリーで格納するモードでも、バイナリなのは画像そのものの領域で、ヘッダ領域はプレーンテキストになっている。このヘッダ領域のフォーマットについて説明する。ヘッダは以下の様な構造になっている。<height><max>はじめのPxと書いているところは、ファイル形式の種別を示すマジックナンバーとなっている。バイナリテキスト形式は、ASCII形式、バイナリ形式は、RAW形式と呼ばれることもある。このマジックナンバーだけは必ずファイルの先頭にある必要がある。厳密にプログラムで表現するのが面倒なところになる。見た感じでは簡単だが、プログラム上で完全に対応するのは逆に難易度が高い。スペースを2個以上入れる人や、改行、タブを交える人もいるだろう。そのように一定のルールのもと、あらゆるパターンに対応させる必要がある。マジックナンバー2文字の次だが、例では改行を入れている。通常は改行が入っている場合が多いが、仕様上は改行とは限らない。PNM形式ではテキスト領域のトークン(要素)のデリミタ(分離記号)は1つ以上の空白文字になっている。空白文字とは、C言語で標準空白類文字とされる文字だ。列挙すると以下が該当する文字だ。書式送り(FF)これはC言語の標準関数である、isspace()が真を返す文字だ。どの場合でも読み込める必要がある。続いて、マジックナンバーの次の行に書いている#から始まる行はコメントだ。コメントは何もここにだけ現れるとは限らず、テキストの領域であればどこに現れてもよい。ヘッダだけでなく、テキスト形式の場合は画像データ中に現れても仕様違反ではない。\nか、\rが現れるまで、がコメントだ。コメントには画像を出力したツールの名前などが書かれていたりする。コメントの次の行には画像の幅と高さを10進数で記述されている。前述のとおり、幅と高さの間に改行があったり、マジックナンバーと同じ行にあっても間違いではない。最後に、輝度の最大値を10進数で記述する。この行は2値しか取らないPBM形式には不要なため存在しない、PGM形式とPPM形式は指定する必要がある。この画像形式では任意の数字を指定できる。9と書けば0~9の10階調で表現することができる。現在、仕様が拡張され上限65535で、いわゆる16bit深度までの階調を扱える仕様になっている。255より大きな値になっているファイルを読み込まなければならないシーンは稀だろう。まとめると以下の様な構造になる。バイナリ形式の場合は、ここがテキスト形式とバイナリ形式の境目になるため注意が必要だ。バイナリ形式では最後の空白は一つと厳密に決まっている。多くの場合改行で表現されるのだが、Windowsの場合、テキストモードで改行を出力するとCRLFの2byteに変換されてしまう。そのため、プレーンテキストの領域とはいえ、バイナリモードで扱うようにする必要がある。-画像データ-ヘッダ情報に引き続き配置されるのが画像データである。データの格納順は横書き文章と同一で、左上から右側へ走査しながら下に向かう形で格納されている。テキスト形式は1行の長さは70文字以下であることが推奨されている。実際には70文字以上あっても読み込んでくれるツールがほとんどだ。P1(PBM形式)白黒2色のテキスト形式。0が白、1が黒として、順にテキストで格納される。デリミタとしての空白は必ずしも必要ない。隙間なく01が連なっていてもよいし、間に空白があってもよい。読み込む側を作ることを考えると、どちらでも良いという仕様は面倒である。P2(PGM形式)グレースケールのテキスト形式。指定した最大値までの数値を10進数のテキストで順に格納する。数値の桁数は決まっていないため、数値と数値の間にはデリミタが必要である。P3(PPM形式)フルカラーのテキスト形式。指定した最大値までの数値で、RGBの順に10進数のテキストで順に格納する。数値の桁数は決まっていないため、数値と数値の間にはデリミタが必要である。P4(PBM形式)白黒2値のバイナリ形式。上位ビットから順に、1byteに8ピクセル分格納する。あれば、0x0Fと格納される。画像の幅が8の倍数でない場合は、最後の1byteに余地が残るが、次の行のデータはつめ込まない。0x00,0xf0と行ごとに分離する。P5(PGM形式)グレースケールのバイナリ形式、指定した最大値までの数値を1ピクセル1byteで順に格納する。1byteに2ピクセル分格納できるが、そのようなことは行われず、必ず1byte使用する。最大値が256以上の場合2byte必要になるが、その場合はビッグエンディアンで格納される。P6(PPM形式)フルカラーのバイナリ形式、指定した最大値までの数値で、RGBの順に1byteずつ、1ピクセル3byteで順に格納する。P5と同じで3byte以下で表現できる場合もまとめるようなことは行われない。最大値が256以上の場合も同様に、ビッグエンディアンの2byteで格納される。更新情報2018/07/28lsっぽいコマンドを作る13アップしました。2018/07/13lsっぽいコマンドを作る12アップしました。2017/01/04lsっぽいコマンドを作る11アップしました。2017/01/03lsっぽいコマンドを作る10アップしました。(https://commoncrawl.org/faq/)。