ビットマップ(BMP)を扱う
最終更新日:2000/02/20
  Microsoft Windows 環境では、最終的に、ウインドウ上にイメージを
表示する為には、ビットマップ形式で行わなければなりません。
ビットマップ形式についての詳細は、API のマニュアル等に詳しく
記載されています。
ここでは、補足的な説明だけしたいと思います。

【 DIB と、DDB 】

  DIB は、「デバイスに依存しないビットマップ」と呼ばれ、
非常に良く使われます。
これに対して、DDB は「デバイス固有のビットマップ」と呼ばれます。
基本的には、直接表示に使うのは、DDB ですが、その内部形式を
直接扱う事は出来ません(または、しません)。
DIB は、直接、その内部のピクセル(1ドット)にアクセス出来ますから、
イメージを加工する上で、知っておくと便利です。

DIB -> DDB への変換は、 CreateDIBitmap() API を使います。

加工も出来ない DDB を持っていても、仕方が無い気もしますが、
DDB を利用する目的に、1つは、ウインドウの再描画が必要に
なると、アプリケーションが自力で描画しなければなりませんが、
この時、DDB を保持していれば、効率的に行えるものと推察されます。

【 DIB と BMP ファイル 】

  DIB と BMP ファイルの内容は、ほとんど同じです。
極端に言えば、BITMAPFILEHEADER という 14 バイトの先頭データを
除いたものが、DIB です。
(素直に作れば、そうですが、仕様上は、多少ひねくれて格納する事も、
出来ますので、必ずしも、そうとは限りません)
従って、BMP ファイルから、DIB を作成する事、およびその逆も
比較的に簡単です。
DIB はフルカラーとパレット(256 色以下)形式とで、異なりますが、
次のようなメモリ上に連続した、可変長のデータです。

・フルカラー(16 bit、24 bit、32 bit)

   +---------------------------------+
   | BMPINFOHEADER | イメージデータ  |
   +---------------------------------+
   |<- 40 bytes  ->|

・パレットカラー(1 bit、4 bit、8 bit)

   +--------------------------------------------------+
   | BMPINFOHEADER | カラーマップ | イメージデータ    |
   +--------------------------------------------------+
   |<- 40 bytes  ->|<-  色数*4  ->|


【 イメージデータ 】

  DIB のイメージデータは、ピクセルを左から右へ走査した"行"を
列数分、連ねた、単純な形式です。
ただし、以下の注意点があります。

    ・行のサイズは DWORD(4バイト)単位でなければならない。
    ・行は、下から上への順番で格納される。(通常の感覚と逆)

【 RLE 圧縮・解凍ユーティリティ 】

  ビットマップ操作の例として、RLE(ランレングスエンコード)
を取り上げてみます。
RLE 圧縮は、余り使われる事はありませんが、256 および 16 色カラーで
のみ使える、ビットマップ仕様での、圧縮形式です。
可逆圧縮で、同じ色が連続するような、単純なイメージでは、結構、
ファイルサイズを小さくする事が出来ます。
ロジックは簡単ですので、プログラムは私が自分で全て書きました。

アプリケーションは、コンソール(DOS窓)上で動作する短い
ものですが、一部を共通ライブラリとする設計にしたので、
ソースは分けてありあます。

bmprle.c・・・コンソール用 MAIN
bmplib.c・・・DIB 入出力、RLE 圧縮・解凍
bmplib.h・・・ヘッダーファイル
makefile・・・構築用 MAKEFILE

ここで、作成したライブラリ(bmplib.lib と、bmplib.h)は、JPEG や、
PNG でも、使用します。

|HOME|戻る|