ページ 11

BITMAPINFO構造体の使い方(カラーテーブルについて)

Posted: 2010年12月18日(土) 13:21
by トム
いつもお世話になっています。

BITMAPINFOについて質問なんですが、
たとえば256個のRGBQUAD構造体でカラーテーブルを作ったとします。
でもBITMAPINFOには

typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

のとおりRGBQUADの要素数1の配列しかありません。
無理やりmemcpyなどでbmiColorsの後ろにメモリをコピーしても
ランタイムエラーでbmiColorsの周りが崩壊していると怒られてしまいます。

BYTE *bi = new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256]
でメモリを確保して
StretchDIBitsに(BITMAPINFO*)bi
などとして渡せばうまく動くには動くのですが
これだとBITMAPINFOの存在意義がなくなってしまいます。
もっとスマートな解決方法はないでしょうか。

急ぎの疑問ではないのですがもしよろしければお願いします。

環境:Vista, VS 2005

Re: BITMAPINFO構造体の使い方(カラーテーブルについて)

Posted: 2010年12月18日(土) 13:43
by toyo
インデックスカラーの個数が不定なので1個の配列として定義してあります
RGBQUAD* bmiColors;
として使用する感じでしょうか

Re: BITMAPINFO構造体の使い方(カラーテーブルについて)

Posted: 2010年12月18日(土) 16:54
by ISLe
BYTE *bi = new BYTE[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * (256-1)];
でも良いですが
トム さんが書きました:BYTE *bi = new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256];
のほうがスマートですね。
トム さんが書きました:これだとBITMAPINFOの存在意義がなくなってしまいます。
そんなことは無くて
((BITMAPINFO*)bi)->bmiColors[255]
というふうに参照するときにはちゃんと役立ちます。

Re: BITMAPINFO構造体の使い方(カラーテーブルについて)

Posted: 2010年12月20日(月) 20:46
by トム
遅い返信で申し訳ありません。

お二人ともどうもありがとうございました。
使い方やなぜ1個の配列なのかがよくわかりました。