CBitmap wBit01 ;
char *temp ;
BITMAP bm;
wBit01.LoadBitmap(IDB_B1) ;
wBit01.GetBitmap(&bm) ;
temp = (char *)calloc(bm.bmWidth*bm.bmHeight*bm.bmBitsPixel/8,sizeof
(char)) ;
wBit01.GetBitmapBits(bm.bmWidth*bm.bmHeight*bm.bmBitsPixel/8 ,temp) ;
for (j = 0 ; j < bm.bmHeight;j++) {
for (i = 0 ; i < bm.bmWidth;i++) {
int p =
j*bm.bmWidth*bm.bmBitsPixel/8+i*bm.bmBitsPixel/8 ;
wDC.SetPixel(i,j,temp[p] & 0xff) ;
}
}
CBitmap::LoadBitmap() で読み込んだビットマップファイルの情報を、
CBitmap::GetBitmap() でBITMAP構造体へ読み込みました。
その情報からキャラクター配列へよみこんで表示しています。
理解できないのは、BITMAP構造体のHELPの内容で、
bmBitsPixel が
1 ピクセルを定義するのに必要な、各プレーン上の隣接したカラー ビットの数を指定
します。 となっています。
実際、bmBitsPixel = 16 となっていて、この16ビットが何をあらわすのか、わかりませ
ん。
どなたかご存知でしたら、よろしくお願いします。
画面の設定などで16ビットカラーとか32ビットカラーとかあると思いますが、
同じ事です。画素子を表現するという事はその画素子の色等の情報を表すという事です。
bmBitsPixel=16というのは、一画素子の情報を16ビットで表現しているという意味です。
色等の情報と書いているのは、パレットを使用して表現する場合と、
色情報を直接画素子情報として格納する場合があるからです。
この辺の詳しい説明をしているホームページを探してよく読んでみると良いと思います。
ビットマップがどのようにして画像を表現しているかがわかれば、データを直接弄る方法
についても大体想像が出来ると思いますよ。
追伸。
一画素子が一バイト決まっているわけでは有りません。
一画素子の表現に必要なバイト数は、その画像が何ビットで色を表現しているかに
かかってきます。この辺は画像を扱う上では基本的な事なので上に書いているように
画像処理を扱っているホームページで勉強された方が良いと思いますよ。
追伸の追伸。
CreateDIBSectionをキーワードにしてHELPを見てみてください。
この方法を使うと画素子の先頭アドレスが得られます。
メモリDCにDIBを作成しておいて、これにロードしたビットマップを貼り付けると
直接、アドレス指定で画素子情報を参照できると思います。
あと、ビットマップの幅とデータ上の1ラインの長さは必ずしも直接的な関係に
なっていません。これは、4バイトバウンダリの考え方があるせいです。
この辺の詳しい話は、
猫でもわかるC言語のホームページに行ってWindows SDK編 第2部の169章から
通読してみてください。
かなり詳しく解説されています。
PATIOさん、いつもありがとうございます。
BITMAPファイルのDIBファイルは、以下のような
フォーマットになっていて、
bmBitsPixel(=16) は、パレットのビット数であることがわかりました。
つまりパレットが64Kあります。
BITMAPFILEHEADER
BITMAPINFOHEADER
パレット
ビットイメージ
ひとまず、意味がわかりましたので解決とします。
ご協力ありがとうございました。