いつもお世話になっています。
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
BITMAPINFO構造体の使い方(カラーテーブルについて)
Re: BITMAPINFO構造体の使い方(カラーテーブルについて)
インデックスカラーの個数が不定なので1個の配列として定義してあります
RGBQUAD* bmiColors;
として使用する感じでしょうか
RGBQUAD* bmiColors;
として使用する感じでしょうか
Re: BITMAPINFO構造体の使い方(カラーテーブルについて)
BYTE *bi = new BYTE[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * (256-1)];
でも良いですが
((BITMAPINFO*)bi)->bmiColors[255]
というふうに参照するときにはちゃんと役立ちます。
でも良いですが
のほうがスマートですね。トム さんが書きました:BYTE *bi = new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256];
そんなことは無くてトム さんが書きました:これだとBITMAPINFOの存在意義がなくなってしまいます。
((BITMAPINFO*)bi)->bmiColors[255]
というふうに参照するときにはちゃんと役立ちます。
Re: BITMAPINFO構造体の使い方(カラーテーブルについて)
遅い返信で申し訳ありません。
お二人ともどうもありがとうございました。
使い方やなぜ1個の配列なのかがよくわかりました。
お二人ともどうもありがとうございました。
使い方やなぜ1個の配列なのかがよくわかりました。