Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> PNM画像の作成

Netpbm(PPM、PGM、PBM、PNM)画像ファイルの作成

ここでは画像フォーマットPPM、PGM、PBM(まとめてPNM称される)の作成方法について記述する。

PNMは構造が非常に単純で、しかもテキスト形式(ASCII形式ともいう)でもバイナリ形式でも記述できる。そのため、プログラム内から画像を作成する場合にライブラリなどなしでどのプラットフォームでも簡単に作成できる。
欠点は圧縮されていないため、BMPファイルなどと同様ファイルサイズが大きくなってしまうことである。
一般的には、まずプログラム内では、PNMで作成して、そこからImageMagickなどを呼び出して、他の形式に変換して圧縮すると良い。

白黒のPBM(portable bitmap format)、グレースケールのPGM(portable graymap format)、フルカラーのPPM(portable pixmap format)がある。
拡張子はそれぞれ.pbm、.pgm、.ppmである。

ファイルを開くには?

この画像形式は多くのファイルビューアが対応している。例えば

IrfanView
GIMP

などが代表的なところである。

ファイル構造

テキスト形式であれバイナリ形式であれ、データ行直前の行までは両形式とも同じ様にテキスト形式で記述する。

1行目

ファイル形式の指定

P1:テキスト形式の白黒画像
P2:テキスト形式のグレースケール画像
P3:テキスト形式のフルカラー画像
P4:バイナリ形式の白黒画像
P5:バイナリ形式のグレースケール画像
P6:バイナリ形式のフルカラー画像

2行目(なくても、あるいは複数行合っても良い)

コメント
#で始める。

3行目

画像のサイズ。
横 縦の順にスペースを空けて書く。

4行目(グレースケール、フルカラー画像の場合)

最大値
指定できるのは1~65536
ただし、256以上の数値を指定すると、バイナリ形式の場合、各値2バイトとして扱われる。2バイトの場合、ビッグエンディアンなのでインテル系で扱う場合は注意が必要である。

4行目以降(白黒画像の場合)

白黒画像の場合はこの行以降データ。
テキスト形式の場合、改行の位置は関係なく、また一行あたりホワイトスペースを入れて70文字までに納める(ただし大抵のソフトではこれを超えても読み込めるようである)。

5行目以降

グレースケールおよびカラー画像の場合はデータ。
テキスト形式の場合、改行の位置は関係なく、また一行あたりホワイトスペースを入れて70文字までに納める(ただし大抵のソフトではこれを超えても読み込めるようである)。

PBM(白黒)画像

テキスト形式の場合、0、1で記述する。0が白で1が黒である(これは他の形式が0が黒になるのと逆である)。
間に入れるスペースは2つ以上入れても良い。
テキスト形式の場合、一行あたりホワイトスペースを入れて70文字まで(ただし大抵のソフトではこれを超えても読み込めるようである)。

P1
# PBM test
10 4
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0

例2、複数行のコメント

P1
# PBM test
# PBM test 2nd line
10 4
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0

例3、コメントなし

P1
10 4
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0

このまま、テキスト形式で保存し、拡張子をpbmにすれば、画像ビューアで開くことができる。

配列int b[x][y]に保存された白黒画像(bの値は0か1)をテキスト形式で保存するプログラム例は

のようになる。

PBM形式の場合、バイナリ形式は1ビット1ピクセルであるので少し大変であるが、ファイルサイズはかなり圧縮できる。

配列int bitmap[x][y]に保存された白黒画像(bitmapの値は0か1)をバイナリ形式で保存するプログラム例は

プログラム例

PGM(グレースケール)画像

0から[最大値]の間で記述する。
[最大値]のとれる最大値は65536である。
0が黒で[最大値]が白になる。
各値の間に入れるスペースは2つ以上入れても良い。
テキスト形式の場合、一行あたりホワイトスペースを入れて70文字まで(ただし大抵のソフトではこれを超えても読み込めるようである)。

例、上記白黒と同じ画像

P2
# PGM test
10 4
255
255 255 255 255 255 255 255 255 255 255
255 255 0   0   0   0   0   255 255 255
255 255 255 255 255 255 0   255 255 255
255 255 255 255 255 255 255 255 255 255

例2、最大値を15に

P2
# PGM test
10 4
15
15 15 15 15 15 15 15 15 15 15
15 15 0  0  0  0  0  15 15 15
15 15 15 15 15 15 0  15 15 15
15 15 15 15 15 15 15 15 15 15

例3、最大値を1にすると、PPMの白黒を逆にしたものとなる。

P2
# PGM test
10 4
1
1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 0 0 1 1 1
1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1 1

例4、グラデーション、最大値は9

P2
# PGM test
10 4
9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

プログラム例

配列int bitmap[x][y]に保存されたグレースケール画像(bitmapの値は0から[最大値])をテキスト形式で保存するプログラム例は

のようになる。

PPM(フルカラー)画像

RGBの順で記述し、3つで1ピクセルを表す。
各値の間に入れるスペースは2つ以上入れても良い。
テキスト形式の場合、一行あたりホワイトスペースを入れて70文字まで(ただし大抵のソフトではこれを超えても読み込めるようである)。

プログラム例

配列int r[x][y]、int g[x][y]、int b[x][y]に保存されたRGB画像(各値は0から[最大値])をテキスト形式で保存するプログラム例は

のようになる。


最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.