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)

0 件のコメント:

コメントを投稿