C3Lab研究室

Back to Title Page(OpenLab)タイトルページへ戻る

最終更新日: 1999年 03月 25日 木曜日

*DIB (Device Independent Bitmap)ファイルを読み込む

DIB(デバイス非依存BITMAP)ファイルの読み込みについて

 
 WindowsではDIBとDDBの2種類のビットマップが存在するため、混乱するかたも
多いようなのでその解説とDIBファイルを読み込み、HBITMAPハンドルの生成(DDB への変換)関数のサンプルを掲載しておきます。

DDB

DDBはデバイス依存型のビットマップで、通常メモリー内イメージとして デバイスコンテキストに割り当て使用されます。
 特徴としては、ユーザーの画面構成に依存し、画面の色数などに依存したビットマップなので、 このメモリーイメージを保存しても他のコンピュータで再現できる保証のないものです。
DIB

DIBはデバイス非依存型のビットマップで、通常外部ファイルの形で保存され 必要に応じてメモリーに読み込まれ、DDBに変換され画面表示などに使用されます。

 Windows APIではHBITMAPをディスプレイデバイス互換コンテキストに
割り当て、ディスプレイデバイスコンテキストにBitBltすることで画面出力を行います。
詳しい画面出力についてのサンプルは次回掲載します。

 サンプルプログラムについてですが、このサンプルプログラムではパレットカラーを使用 しないRGBカラー(256色を超える色数、16・24・32ビット色等)のDIBファイル の読み込みを行い、HBITMAPに割り当てます。
割り当てができない場合は、NULLを返します。

HBITMAP LoadDIBFile(LPCTSTR filename)
{
    if(filename==NULL)return NULL;
    CFile cf;
    void *p;
    BITMAPFILEHEADER    bmfh;
    BITMAPINFOHEADER    bmih;
    HBITMAP                 hbmp = NULL;
    BITMAPINFO             bmi;
    int                     size;
    CDC *cdc;

    ZeroMemory(&bmi,sizeof(bmi));
    if(cf.Open(filename,CFile::modeRead)==FALSE)return NULL;
    cf.Read(&bmfh,sizeof(bmfh));
    cf.Read(&bmih,sizeof(bmih));
    size=bmih.biWidth*abs(bmih.biHeight)*bmih.biBitCount/8;
    p    =malloc(size);
    bmi.bmiHeader = bmih;
    cf.Read(p,size);
    cf.Close();
    cdc = this->GetDC();
    hbmp = ::CreateDIBitmap(cdc->m_hDC,&bmih,CBM_INIT,p,&bmi,DIB_RGB_COLORS);
    this->ReleaseDC(cdc);
    return hbmp;
}

Copyright (C) Kitaro 1999