PNM (画像フォーマット)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Portable pixmap
拡張子 .ppm, .pgm, .pbm, .pnm
MIME Type image/x-portable-pixmap, -graymap, -bitmap, -anymap all unofficial
マジックナンバー P1 - P6
開発者 Jef Poskanzer
種別 画像ファイルフォーマット
テンプレートを表示

PNM (Portable aNyMap 形式、Netpbm形式) という名前で指される画像形式は、特定の一種類の画像フォーマットではなく、3種類の画像形式をまとめて呼ぶときに使われる[1]。これらの形式は、それぞれ portable pixmap format (PPM 形式)、portable graymap format (PGM 形式)、portable bitmap format (PBM 形式) と呼ばれ、どれも異なるプラットフォーム間でも高い互換性を保てる画像形式として開発されたものである。

開発の経緯[編集]

PBM形式はプレーンテキストとして電子メールで受送信でき、ASCII コードが廃れた後でも使える画像フォーマットを開発する目的で、1980年代にJef Poskanzerが考案した白黒二値のビットマップ画像のデータ形式である。

PBM形式の画像を扱うツールを開発するために、Pbmplusというライブラリが開発された。これはPBM提案者のJef Poskanzerによるもので、1988年にリリースされた。続いて彼はPGM形式およびPPM形式を提唱し、それを扱うために拡張したPbmplusをリリースした。Pbmplusは1991年12月10日までリリースが続いた。

1993年に、そのときにはすでに開発が止まっていたPbmplusの代替となるライブラリとしてNetpbmが開発された。これはPbmplusに世界各地から寄せられた修正案を適用し、まとめ直したものであった。現在、PBM、PGM、PPM形式画像を扱うライブラリとして最も多く利用されているのはNetpbmであろうと考えられている[2]

データ形式[編集]

各形式は、色をどう表現するかという点で異なっている。

  • PBM は本当の意味でのビットマップである (白と黒の二値しか表現しない)
  • PGM はグレイスケールを表現できる
  • PPM は RGB でフルカラーを表現できる、"pixmaps" である

どの形式でも最初の2バイト (テキスト形式) がマジックナンバーとなっており、ファイル形式 (PBM、PGM、PPMのどれか) と、データがテキストかバイナリかを表している。その2バイトの最初は大文字の P で、その後に続く1つの数字が種類を表す。

File Descriptor Type Encoding
P1 Portable bitmap ASCII
P2 Portable graymap ASCII
P3 Portable pixmap ASCII
P4 Portable bitmap Binary
P5 Portable graymap Binary
P6 Portable pixmap Binary

テキスト形式のデータは、テキストエディタなどで見るのも、他の形式に変換するのも容易である (そういう作業を行うプラットフォームで ASCII コードが正しく扱えるのであれば)。バイナリ形式ではファイルサイズが節約でき、ファイル中に空白文字がないため簡便な方法でファイルを解析できる。また、どちらの形式でも圧縮は行なわないため、画像の劣化の問題を回避できる。


PBM の例[編集]

以下にPBM形式の簡単な例を示す。

P1
# This is an example bitmap of the letter "J"
6 10
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0

最初の "P1" という文字列で、これがPBM形式であることが示されている。シャープ記号は、その行がコメント行であることを示す。その下の2つの数値はそれぞれ画像の横幅と高さを示す。その後にピクセルの値 (ここでは白黒画像なので、0 か 1 のどちらかだけ) が続く。

以下に、このデータが表す画像を示す。

Example of ASCII-art turned into a bitmap.pbm.png

以下に、この画像を20倍に拡大したものを示す。

Example of ASCII-art turned into a bitmap scale20.pbm.png


PGM の例[編集]

PGMとPPMの各形式では、テキスト形式でもバイナリ形式でも、画像中に現れるピクセルの値の最大値を、画像のサイズの後に示す必要がある。

P2
# Shows the word "FEEP" (example from Netpbm man page on PGM)
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

このデータが示す画像は以下のようになる:

Feep netbpm p2 pgm example.png

PPM の例[編集]

P3
# The P3 means colors are in ASCII, then 3 columns and 2 rows, then 255 for max color, then RGB triplets
3 2
255
255 0 0
0 255 0
0 0 255
255 255 0
255 255 255
0 0 0

上のデータが示す画像 (を拡大したもの):

Tiny6pixel.png

P6 (バイナリ形式) では、各ピクセルのR、G、Bの各成分が、この順番でそれぞれ1バイトで表される (したがって各ピクセルが3バイトで表される)。ファイルサイズはテキスト形式の1/2~1/4程度に小さくなるが、データを直接見ても分かりにくい。

PBM/PGM/PPM形式は圧縮は行わないため、圧縮を行う形式の画像と比べるとファイルサイズが大きくなる。たとえば上のPNG画像はサイズが192x128で187バイトでだが、これを同じサイズのPPM画像に変換すると約72Kバイトになる。PPM形式は適当なライブラリの支援を受けずに画像の操作を行なうときや、圧縮伸張のコストを掛けずに画像の操作を行ないたいときに使い、最終的にはPNGなどのより効率のよい形式にするのがいいだろう。

16ビット拡張[編集]

PGM形式とPPM形式の元々のバイナリ形式 (P5およびP6) はビット深度は8ビットまでしかサポートしていなかった。テキスト形式でこれを拡張するのは容易だが、それにより画像の操作に時間がかかるようになり、またファイルサイズも大きくなる。そこで、多くの拡張法が試みられた。ビット深度を8ビットよりも大きくすると、エンディアンの問題が生じ、様々な実装でバイト・オーダーが一致しないという事態が生じた[3]。実装のデファクトスタンダードのNetpbmではビッグエンディアンである。

脚注[編集]

  1. ^ PBM, PGM, PNM, and PPM: Summary
  2. ^ Netpbm history
  3. ^ Pnmtotiff User Manual”. SourceForge の解説ページ (2005年3月27日). 2009年8月4日閲覧。
  • PNM形式の各画像フォーマットについて (以下すべて英語)

関連項目[編集]