PNM画像形式:PBM、PGM、PPMの概要
PNM(Portable Any Map)形式は、シンプルながらも汎用性の高い2次元ラスター画像フォーマットです。PNM自体は単一の形式ではなく、異なるカラーモードに対応する3種類のフォーマット、PBM、PGM、PPMの総称として用いられます。これらは、プラットフォームに依存せず、様々な環境で互換性高く利用できることを目指して開発されました。
開発の歴史
PNM形式の起源は、Jef Poskanzer氏による1980年代のPBM(Portable Bitmap)形式の考案に遡ります。PBMは、
電子メールでの送受信を容易にするため、ASCIIコードで表現できる白黒二値のビットマップ形式として設計されました。
PBMを扱うためのライブラリとして、1988年にPbmplusがリリースされました。その後、Poskanzer氏はグレースケールに対応するPGM(Portable Graymap)形式と、フルカラーに対応するPPM(Portable Pixmap)形式を提案し、Pbmplusも拡張されました。Pbmplusは1991年まで開発が続けられましたが、1993年には世界中の開発者からの貢献を取り込んだ
Netpbmが、Pbmplusの後継ライブラリとして開発されました。現在では、
NetpbmがPBM、PGM、PPM形式を扱う主要なライブラリとして広く利用されています。
データ形式
PBM、PGM、PPMの3形式は、色の表現方法が異なります。PBMは白黒二値のみ、PGMはグレースケール、PPMは
RGBによるフルカラーに対応します。
どの形式も、ファイルの先頭2バイトにマジックナンバーが記述され、ファイルの種類(PBM、PGM、PPM)とデータ形式(テキストまたはバイナリ)が識別されます。マジックナンバーは「P」に続く数字(1~6)で表され、1、4はテキスト形式のPBM、2、5はテキスト形式のPGMとPPM、3、6はバイナリ形式のPPMとPGMです。テキスト形式は人間が読み書き可能で、バイナリ形式はファイルサイズが小さくなります。いずれも圧縮は行いません。
バイナリ形式では、PBMはピクセル1つにつき1ビット、PGMは8ビットまたは16ビット、PPMは8ビット×3または16ビット×3を使用します。PPMでは、赤、緑、青の各成分がそれぞれ指定されたビット数で表現されます。
アルファチャンネルや
クロマキーはサポートされません。また、PBMは8ビット境界、PGMとPPMは8ビット境界を持ち、32ビット境界のパディングは必要ありません。
各形式の例
PBMの例
テキスト形式のPBMファイルは、マジックナンバー「P1」、コメント行(#で始まる行)、画像サイズ(幅と高さ)、そしてピクセルデータ(0または1)で構成されます。0は白、1は黒を表すのが一般的です。
PGMの例
PGMとPPMでは、テキスト形式とバイナリ形式の両方において、画像データの前に最大輝度値(ホワイトポイント)が記述されます。これは、グレースケールやカラーのピクセル値の最大値を示すものです。
PPMの例
PPMはフルカラーに対応しており、テキスト形式では
RGBのトリプレットで各ピクセルの色が指定されます。バイナリ形式では、R、G、Bの順に1バイトずつで表現されます。
ファイルサイズと圧縮
PNM形式は非圧縮であるため、圧縮形式(例えばPNG)と比べてファイルサイズが大きくなります。そのため、画像の編集や操作を圧縮・伸張の手間をかけずに済ませたい場合に適していますが、最終的にはPNGなどのより効率的な圧縮形式に変換することを推奨します。
16ビット拡張
元のPGMとPPMのバイナリ形式(P5、P6)は8ビットまでしかサポートしていませんでしたが、テキスト形式では16ビット拡張が容易です。しかし、バイナリ形式で16ビット拡張を行うと、
エンディアンの問題(バイトオーダー)が発生する可能性があります。
Netpbmではビッグ
エンディアンが採用されています。
まとめ
PNM形式は、その簡素さとプラットフォーム非依存性から、画像処理における基礎的なフォーマットとして長年にわたって利用されてきました。しかし、非圧縮であるためファイルサイズが大きくなるという欠点もあります。用途に応じて適切な形式を選択することが重要です。