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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
トム
記事: 4
登録日時: 13年前

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

#1

投稿記事 by トム » 13年前

いつもお世話になっています。

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

アバター
toyo
記事: 35
登録日時: 13年前
住所: 宮崎県

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

#2

投稿記事 by toyo » 13年前

インデックスカラーの個数が不定なので1個の配列として定義してあります
RGBQUAD* bmiColors;
として使用する感じでしょうか

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#3

投稿記事 by ISLe » 13年前

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

アバター
トム
記事: 4
登録日時: 13年前

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

#4

投稿記事 by トム » 13年前

遅い返信で申し訳ありません。

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

閉鎖

“C言語何でも質問掲示板” へ戻る