トップダウン DIB とボトムアップ DIB

グラフィックス プログラムの経験が浅い場合、ビットマップは、イメージの最初の行がバッファの最初に、その後は次の行というように、メモリ内に配置されると考えるかもしれない。しかし、これは必ずしも正しいわけではない。Windows では、デバイスに依存しないビットマップ (DIB:Device Independent Bitmap) は、ボトムアップとトップダウンという 2 つの異なる方向でメモリ内に配置できる。

"ボトムアップ" DIB では、イメージ バッファはピクセルの最も下 (ボトム) の行から始まり、順に上の行が続く。イメージの最も上の行は、バッファ内の最後の行になる。したがって、メモリ内の最初のバイトはイメージの "左下" のピクセルである。GDI では、すべての DIB はボトムアップである。次の図は、ボトムアップ DIB の物理的なレイアウトを示している。

ボトムアップ DIB

トップダウン DIB では、行の順序が逆になる。イメージの最も上 (トップ) の行がメモリ内の最初の行になり、順に下の行が続く。イメージの最も下の行は、バッファ内の最後の行になる。トップダウン DIB の場合、メモリ内の最初のバイトはイメージの "左上" のピクセルである。DirectDraw ではトップダウン DIB を使う。次の図は、トップダウン DIB の物理的なレイアウトを示している。

トップダウン DIB

RGB DIB の場合、イメージの方向は BITMAPINFOHEADER 構造体の biHeight メンバによって指定される。biHeight が正の場合、イメージはボトムアップである。biHeight が負の場合、イメージはトップダウンである。

YUV フォーマットの DIB は常にトップダウンであり、biHeight メンバの符号は無視される。デコーダは biHeight が正の YUV フォーマットを提供するべきであるが、biHeight が負の YUV フォーマットも受け入れて、符号を無視するべきである。

また、biCompression メンバに FOURCC を使うタイプの DIB では、方向に関係なく、biHeight を正の数として表すべきである。FOURCC 自体が圧縮方式を識別し、そのイメージの方向は互換性のあるフィルタが認識するからである。