デバイスに依存しないビットマップ

デバイスに依存しないビットマップ (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 段階のプロセスに従って、ビデオ ディスプレイ (プリンター) の水平方向の解像度を取得できます。

  1. 2 番目の引数として HORZRES を指定して、 GetDeviceCaps 関数を呼び出します。
  2. GetDeviceCaps を 2 回目に呼び出し、HORZSIZE を 2 番目の引数として指定します。
  3. 最初の戻り値を 2 番目の戻り値で除算します。

アプリケーションは、異なるパラメーターを持つ同じ 3 ステップ プロセス (HORZRES の代わりに VERTRES、HORZSIZE の代わりに VERTSIZE) を使用して垂直解像度を取得できます。

パレットは、ディスプレイ デバイスのカラー パレット内の各色の赤、緑、青の強度コンポーネントを指定する RGBQUAD 構造体の配列で表されます。 パレット配列の各カラー インデックスは、ビットマップに関連付けられている四角形領域の特定のピクセルにマップされます。 この配列のサイズ (ビット単位) は、四角形の幅 (ピクセル単位) に四角形の高さを乗算した値 (ピクセル単位) に、デバイスのカラー ビットの数を乗算したものです。 アプリケーションは、 GetDeviceCaps 関数を呼び出し、NUMCOLORS を 2 番目の引数として指定することで、デバイスのパレットのサイズを取得できます。

Windows では、8-bpp と 4-bpp のボトムアップ DIB のパレット配列の圧縮がサポートされています。 これらの配列は、実行長エンコード (RLE) スキームを使用して圧縮できます。 RLE スキームでは、2 バイトの値を使用します。最初のバイトは、カラー インデックスを使用する連続するピクセル数と、インデックスを指定する 2 番目のバイトを指定します。 ビットマップ圧縮の詳細については、BITMAPINFOHEADER、BITMAPFILEHEADERBITMAPV4HEADER、および BITMAPV5HEADER 構造体の説明を参照してください。

アプリケーションは、必要な構造体を初期化し 、GetDIBits 関数を呼び出すことによって、DDB から DIB を作成できます。 デバイスがこの関数をサポートしているかどうかを確認するには、 GETDeviceCaps 関数を呼び出し、RASTERCAPS フラグとしてRC_DI_BITMAPを指定します。

ビットマップをコピーする必要があるアプリケーションでは、 TransparentBlt を使用して、透明色に一致するピクセルを除き、ソース ビットマップ内のすべてのピクセルをコピー先ビットマップにコピーできます。

アプリケーションでは、DIB を使用して 、SetDIBitsToDevice または StretchDIBits 関数を呼び出して、ディスプレイ デバイスのピクセル 設定できます。 デバイスが SetDIBitsToDevice 関数をサポートしているかどうかを確認するには、 GETDeviceCaps 関数を呼び出し、RASTERCAPS フラグとしてRC_DIBTODEV指定します。 RC_STRETCHDIBを RASTERCAPS フラグとして指定して、デバイスが StretchDIBits をサポートしているかどうかを判断します。

既存の DIB を表示するだけで済むアプリケーションでは 、SetDIBitsToDevice 関数を使用できます。 たとえば、スプレッドシート アプリケーションでは、 SetDIBitsToDevice 関数を使用して既存のグラフを開いてウィンドウに表示できます。 ただし、ウィンドウ内でビットマップを繰り返し再描画するには、アプリケーションで BitBlt 関数を使用する必要があります。 たとえば、アニメーション化されたグラフィックスとサウンドを組み合わせたマルチメディア アプリケーションは、SetDIBitsToDevice よりも高速に実行されるため、BitBlt 関数を呼び出すことでメリットがあります。