Windowsコード集 上のページ

#0003 DIBSectionをクラス化する

非デバイス依存ビットマップの生成クラスです。
この方法だと、ビットマップ画像を直接操作する事ができるのでかなり便利なのです。
// 画像サイズを求めるマクロ
#define GET_DIBSIZE(bi)         (\
    (bi->bmiHeader.biSizeImage != 0) ? bi->bmiHeader.biSizeImage : \
    (((bi->bmiHeader.biWidth * (bi->bmiHeader.biBitCount / 8) + 3) & 0xfffffffc) * bi->bmiHeader.biHeight)\
    )

class CDIBSection{
public:
    // パブリックメンバ
    HBITMAP m_bmp;
    HANDLE m_map;
    LPBYTE m_bits,m_topimage;
    LONG m_width,m_height,m_pitch;

    // メンバ関数
    CDIBSection():m_bmp(NULL),m_map(NULL),m_bits(NULL){;}
    ~CDIBSection(){Delete();}
    BOOL Create(HDC dc,LPBITMAPINFO bi,UINT usage){
        Delete();
        if(CreateMap(GET_DIBSIZE(bi))){
            m_bmp = CreateDIBSection(dc,bi,usage,(LPVOID *)&m_bits,m_map,0);
            m_width  = bi->bmiHeader.biWidth;
            m_height = bi->bmiHeader.biHeight;
            m_pitch  = - ((m_width * bi->bmiHeader.biBitCount + 3) & 0xfffffffc);
            m_topimage = m_bits - (m_height - 1) * m_pitch;
            return (m_bmp != NULL);
        }
        return FALSE;
    }
    BOOL CreateMap(DWORD size){
        m_map = CreateFileMapping((HANDLE)0xffffffff,NULL,PAGE_READWRITE,NULL,size,NULL);
        return (m_map != NULL);
    }
    void Delete(){
        if(m_bmp != NULL){
            DeleteObject(m_bmp);
            CloseHandle(m_map);
        }
        m_bmp = NULL;
        m_map = NULL;
    }
    operator HBITMAP(){return m_bmp;}
};




// 使用方法を簡単に置いておきます。
// あとはメンバを見て、各自研究してみてください。

// クラスの定義
CDIBSection dibs;

// メモリデバイスコンテキスト
HDC memdc;

// ビットマップを生成し、メモリデバイスコンテキストに関連付けする
BITMAPINFO bi;
ZeroMemory(&bi,sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = 640;
bi.bmiHeader.biHeight = 480;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
HDC dc;
dc = GetDC(0);
dibs.Create(dc,&bi,DIB_RGB_COLORS);
memdc = CreateCompatibleDC(dc);
SelectObject(memdc,dibs);
ReleaseDC(0,dc);

// ビットマップのアクセス
*((LPBYTE)dibs.m_topimage + dibs.m_pitch * y + 3 * x + 0) = 0;  // b
*((LPBYTE)dibs.m_topimage + dibs.m_pitch * y + 3 * x + 1) = 0;  // g
*((LPBYTE)dibs.m_topimage + dibs.m_pitch * y + 3 * x + 2) = 0;  // r


上のページ