RE^3:RGBQUADの開放? (みやさか) 1999/10/16 02:28

Win32 SDK の BITMAPINFO 構造体の定義を見ると、

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

となっていて、bmiColors はポインタではなく実体そのものです。ここには、
ダミーの配列要素 bmiColors[1] として定義されているのですが、ここで
C言語の構造体内に可変長の配列を入れるためのちょっとした「裏技」が
使われます。

この構造体用のメモリを LocalAlloc で割り当てるときには、そのバイト数を
以下の式で計算します。palettes はパレットの数です。

 hedsize = sizeof(BITMAPINFO)-sizeof(RGBQUAD)+(palettes)*sizeof(RGBQUAD);

こうすると、実際には sizeof(BITMAPINFO) よりも大きなメモリ領域が
確保されます。そして、bmpinfo.bmiColors[8]; というようにすると、
この余分に割り当てられたメモリ領域にアクセスできるのです。
BITMAPINFO 構造体では、このようにして、ここにパレット配列の実体が
入っています。

もちろんこの裏技は、静的変数や自動変数として割り当てるときには
使えません(サイズが不定なので)。

BMP ファイルのフォーマットを知っているのであれば、BITMAPINFO 構造体
には、BMP ファイルの BITMAPINFOHEADER と RGBQUAD 配列がそのまま
入っている、と思えばいいでしょう。




--「RE^3:RGBQUADの開放?」に対するコメント--
タイトル(Subject):
お名前(Your name):
Mail address:
Password: :入力しておくとあとで削除できます
Your message:




7thBridge P ver0.26 (c)Takechin