Device-Independent ビットマップ
デバイスに依存しないビットマップ (DIB) には、カラー テーブルが含まれています。 カラー テーブルでは、ピクセル値が RGB カラー値 対応する方法を説明します。これは、光を放出することによって生成される色を表します。 したがって、DIB は、任意のデバイスで適切な配色を実現できます。 DIB には、次の色とディメンションの情報が含まれています。
- 四角形イメージが作成されたデバイスの色形式。
- 四角形のイメージが作成されたデバイスの解像度。
- イメージが作成されたデバイスのパレット。
- 赤、緑、青 (RGB) トリプレットを四角形の画像のピクセルにマップするビットの配列。
- ビット配列のサイズを小さくするために使用されるデータ圧縮スキーム (存在する場合) を示すデータ圧縮識別子。
色とディメンションの情報は、BITMAPINFO 構造体に格納されます。これは、BITMAPINFOHEADER 構造体の後に、2 つ以上の RGBQUAD 構造体で構成されます。 BITMAPINFOHEADER 構造体は、ピクセル四角形の寸法を指定し、デバイスのカラー テクノロジを記述し、ビットマップのサイズを小さくするために使用される圧縮スキームを識別します。 RGBQUAD 構造体は、ピクセル四角形に表示される色を識別します。
DIB には次の 2 種類があります。
- 原点が左下隅にあるボトムアップ DIB。
- 原点が左上隅にあるトップダウン DIB。
ビットマップ情報ヘッダー構造体の Height メンバーで示されているように、DIB の高さが正の値である場合は、ボトムアップ DIB です。高さが負の値の場合は、トップダウン DIB です。 トップダウン DIB は圧縮できません。
カラー形式は、カラー プレーンとカラー ビットの数で指定されます。 カラー プレーンの数は常に 1 です。カラー ビットの数は、モノクロ ビットマップの場合は 1、VGA ビットマップの場合は 4、他のカラー デバイスではビットマップの場合は 8、16、24、または 32 です。 アプリケーションは、2 番目の引数として BITSPIXEL を指定して、GetDeviceCaps 関数を呼び出すことによって、特定のディスプレイ (またはプリンター) が使用するカラー ビットの数を取得します。
ディスプレイ デバイスの解像度は、ピクセル単位でメートル単位で指定されます。 アプリケーションは、この 3 段階のプロセスに従って、ビデオ ディスプレイまたはプリンターの水平解像度を取得できます。
- GetDeviceCaps 関数を呼び出し、HORZRES を 2 番目の引数として指定します。
- 2 回目GetDeviceCaps呼び出し、HORZSIZE を 2 番目の引数として指定します。
- 最初の戻り値を 2 番目の戻り値で除算します。
アプリケーションは、異なるパラメーターを持つ同じ 3 ステップ プロセス (HORZRES の代わりに VERTRES、HORZSIZE の代わりに VERTSIZE) を使用して垂直解像度を取得できます。
パレットは、ディスプレイ デバイスのカラー パレット 各色の赤、緑、青の強度コンポーネントを指定する RGBQUAD 構造体の配列で表されます。 パレット配列内の各カラー インデックスは、ビットマップに関連付けられている四角形領域の特定のピクセルにマップされます。 この配列のサイズ (ビット単位) は、四角形の幅 (ピクセル単位) に、四角形の高さをピクセル単位で乗算し、デバイスのカラー ビットの数を乗算した値に相当します。 アプリケーションは、2 番目の引数として NUMCOLORS を指定して、GetDeviceCaps 関数を呼び出すことによって、デバイスのパレットのサイズを取得できます。
Windows では、8 bpp および 4-bpp ボトムアップ DIB のパレット配列の圧縮がサポートされています。 これらの配列は、実行長エンコード (RLE) スキームを使用して圧縮できます。 RLE スキームでは、2 バイトの値を使用します。最初のバイトは、カラー インデックスを使用する連続するピクセルの数と、インデックスを指定する 2 番目のバイトを指定します。 ビットマップ圧縮の詳細については、BITMAPINFOHEADER、BITMAPFILEHEADER、BITMAPV4HEADER、および BITMAPV5HEADER 構造体の説明を参照してください。
アプリケーションは、必要な構造体を初期化し、GetDIBits 関数を呼び出すことによって、DDB から DIB を作成できます。 デバイスがこの関数をサポートしているかどうかを判断するには、GetDeviceCaps 関数を呼び出し、RASTERCAPS フラグとしてRC_DI_BITMAPを指定します。
ビットマップをコピーする必要があるアプリケーションでは、TransparentBlt を使用して、透明な色に一致するピクセルを除き、ソース ビットマップ内のすべてのピクセルをコピー先ビットマップにコピーできます。
アプリケーションは、SetDIBitsToDevice または StretchDIBits 関数を呼び出すことによって、DIB を使用してディスプレイ デバイスにピクセルを設定できます。 デバイスが SetDIBitsToDevice 関数をサポートしているかどうかを確認するには、GetDeviceCaps 関数を呼び出し、rasterCAPS フラグとしてRC_DIBTODEVを指定します。 RC_STRETCHDIBを RASTERCAPS フラグとして指定して、デバイスが StretchDIBits サポートしているかどうかを判断します。
既存の DIB を表示するだけで済むアプリケーションでは、SetDIBitsToDevice 関数を使用できます。 たとえば、スプレッドシート アプリケーションでは、SetDIBitsToDevice 関数を使用して、既存のグラフを開いてウィンドウに表示できます。 ただし、ウィンドウ内でビットマップを繰り返し再描画するには、アプリケーションで BitBlt 関数を使用する必要があります。 たとえば、アニメーション化されたグラフィックスとサウンドを組み合わせたマルチメディア アプリケーションでは、BitBlt 関数を呼び出すと、SetDIBitsToDevice よりも高速に実行されるため、メリットがあります。