ビットマップはそれぞれの色毎に表示、編集することが可能となっています。
例題では、引数に -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 件のコメント:
コメントを投稿