DIBとDDB

Share
MSDNなどを見ると、Windowsで扱うビットマップには大きく分けて2種類があります。
  • デバイス依存ビットマップ(Deveice Dependent Bitmap, DDB)
  • デバイス非依存ビットマップ(Deveice Independent Bitmap, DIB)
このDIBのフォーマットをファイルに適応したのがいわゆるファイルフォーマットとしてのビットマップ(拡張子がbmpになっていると思います)になっているようです。もちろん、ファイルフォーマットですから、Windows以外でも使うことができるはずです。ビットマップファイルフォーマットについては別ページ で触れましたから、ここでは簡単にDDBとDIBの違いについて触れておきます。

なお、詳細についてはMSDNを参考にしてください。

DDBとDIBの違い

私が調べた感じですと、DDBとDIBの大きな違いはデータフォーマットの違いを除けば、色に関する情報があるかないかということのようです。表現が紛らわしいのですが、ここでいう色情報とはR,G,B値など実際にディスプレイに表示する色を決めるために使う情報という意味です。

 DDB  色情報を持っていない 
 DIB 色情報を持つ
 解像度などの情報を持つことも可能

では、DDBの場合、色情報はどう指定するのかとなります。しかし、むしろ話は逆でデバイスコンテキストからDDBを作成することになるため、色情報はデバイスコンテキスト側のものを使うということになっています(はずです)。

フォーマット

DDBとDIBのフォーマットは構造体によって定義されています。話がややこしいのが、DIBの場合、ファイルへ保存する場合のフォーマットとメモリ上に持つ場合のフォーマットが微妙に異なっているようです。

 DDB BITMAP構造体
 DIB(表示時) BITMAPINFO構造体
  これは内部的に
    BITMAPINFOHEADER構造体
    RGBQUAD[1]
  を持つ
  これとは別に画像データを持つ
 DIB(保存時) BITMAPFILEHEADER構造体
  これの直後に
    BITMAPINFOHEADER構造体
    パレットデータ
    画像データ
  と続く 

DDB/DIBの画面への表示

どちらのビットマップも画面へ表示することができます。
DDBの場合、BitBltやStreachBltなどのAPI関数を使います。
DIBの場合、SetDIBitsToDeviceやStreachDIBitsなどのAPI関数を使います。

DDB←→DIBの変換

一方から他方のビットマップに変換することもできます。