ラベル ビットマップ の投稿を表示しています。 すべての投稿を表示
ラベル ビットマップ の投稿を表示しています。 すべての投稿を表示

2011年9月7日水曜日

ビットマップファイルフォーマットのグレースケール化

ビットマップファイルフォーマット(8bit:256パレットカラー/16bit:RGB565/24bit:RGB888/32bit:RGBA8888)の画像の読取/グレースケール化の例です。

以下の例では、読み込んだビットマップファイルを 24bit 濃淡画像として保存しています。
引数にビットマップファイルを指定し、実行すると "gray.bmp" という名前でファイルが保存されます。

ビットマップの読取ライブラリに関しては こちら

BMP読み込みライブラリ等:DL (bmploader.zip)

2011年4月16日土曜日

PNM(Portable anymap ファイルフォーマット)の読み取り/編集/保存、BMPへの変換

PNM 画像の読取/編集/保存例です。

PNM(portable anymap ファイルフォーマット)は、pbm(portable bitmap)、pgm(portable graymap)、ppm(portable pixmap)の各画像フォーマットを総称した名前です。
PNM のファイル形式はテキスト/バイナリ形式を選択することにより、メモ帳等でも簡単に編集することが可能です。

その形式には以下の6種類があります。
P1 (PBM) 2値画像 テキスト形式
P2 (PGM) 濃淡画像 テキスト形式
P3 (PPM) カラー画像 テキスト形式
P4 (PBM) 2値画像 バイナリ形式
P5 (PGM) 濃淡画像 バイナリ形式
P6 (PPM) カラー画像 バイナリ形式

P4〜P6 の形式では画像のヘッダ部分を除いた画像データ部をバイナリ形式で出力しなければならないので、メモ帳等での編集は無理ですが、P1〜P3 の形式はテキスト形式で画像の輝度・色情報(R,G,B)を書き込むことができ、メモ帳等で編集することが可能です。

ファイルフォーマットは以下のようなものです。
Pn | → マジックナンバー: P1〜P6
5 5 +--- ヘッダ部 → 横幅 縦幅
5 | → 最大輝度値(PBMでは必要ない)
0 1 0 1 0 |
0 1 0 1 0 |
0 1 0 1 0 +---画像データ部(PBM,PGMの場合)
0 1 0 1 0 | (PPMでは R,G,B の順に記述)
0 1 0 1 0 |

例題では、PGM/PPM 画像の書き出し、PPM 画像の読み込み、編集した画像の BMP への出力を行っています。

ソース等をまとめたもの:DL(PPM 画像含む)

編集や閲覧用のソフトが手近にない場合は、Windows では Susie/Irfanview、OSX/Linux では GIMP2 にてお試しください。

pnm_output.cpp

pnm_lib.h

pnm_lib.cpp
実行結果

処理結果(grayscale.bmp)

処理結果(colorscale.bmp)

処理結果(output.bmp)

2011年4月15日金曜日

ビットマップファイルの読み込み/編集/保存

ビットマップファイルフォーマット(8bit:256パレットカラー/16bit:RGB565/24bit:RGB888/32bit:RGBA8888)の画像の読取/編集/保存例です。

ビットマップはそれぞれの色毎に表示、編集することが可能となっています。
例題では、引数に -r や -g を与えると、色反転、ガンマ補正を行うことができます。
また、-o/-b により編集を行った画像を指定のビット数で保存します(16bit:RGB565/24bit:RGB888/32bit:RGBA8888 BMP)。

ビットマップは1ライン当たりのデータ数が4Byte(long)の倍数に限られているため、データの読取には注意が必要です。
1ラインが4で割り切れない場合、足りないバイト数(足りない部分はパディングビット=0が詰め込まれている)を加えて計算する必要があります。
具体的には、

bmp.cpp : LoadBMP() 関数内
// 1 ラインあたりのデータ数: 4byte 境界にあわせる
Line = (bmih.biWidth * bmih.biBitCount)/8;
if ( (Line%4) != 0 ) Line = ((Line/4)+1)*4;

のような計算が必要となります。
また、高さが負の値を取る場合もあるため、y 軸を反転して画素を取る工夫も行っています(DL先の書庫内:revdirection24bit.bmp)。

ソース等をまとめたもの:DL (8bit/16bit/24bit/32bit 画像含む)

16bit:RGB565 の画像の準備に手こずりましたが、GIMP2 が RGB565 の読み込み/書き出しに対応していますので、編集ソフト等をお持ちでない場合はそちらでお試しください。
16bit の画像編集は、Android や OpenGL を利用していると利用する機会も増えてきますので(処理も早くなりますし、見た目も 24bit と見劣りしない)、覚えておくとなかなかに便利です。
本例題は、16bit の BMP から 24/32bit の BMP への変換としても利用できます(8bit/16bit/24bit/32bit → 16/24/32bit)。

出力される拡張子 .pgm の画像形式は、グレイスケールの PNM(Portable anymap ファイルフォーマット)であり、テキスト形式で RGB データを出力しています(バイナリ形式で出力することもできます。)。
PNM の読み込み/編集/出力に関しては、こちらで。
表示ソフトとしては、Windows (Susie/Irfanview etc.)、OSX (Graphic Converter)、GIMP2 は全OS、で利用できます。

bmploader.cpp
bmp.h
bmp.cpp
実行結果

元画像(RGB565:16bit)


処理結果(output.bmp:24bit)