ソフトウェア開発 Win32プログラミング

24bpp DIBに変換する

戻る


あるビットマップオブジェクトを24bppのDIBに変換したい場合は、 次のような関数を使うとよいだろう。

#include <windows.h>

static BOOL CopyBitmapBits(HBITMAP hbmDst, HBITMAP hbmSrc, INT cx, INT cy)
{
    BOOL f;
    HDC hDC1, hDC2;
    HGDIOBJ hbmOld1, hbmOld2;
 
    f = FALSE;
    hDC1 = CreateCompatibleDC(NULL);
    if (hDC1 != NULL)
    {
        hDC2 = CreateCompatibleDC(NULL);
        if (hDC2 != NULL)
        {
            hbmOld1 = SelectObject(hDC1, hbmSrc);
            hbmOld2 = SelectObject(hDC2, hbmDst);
            f = BitBlt(hDC2, 0, 0, cx, cy, hDC1, 0, 0, SRCCOPY);
            SelectObject(hDC1, hbmOld1);
            SelectObject(hDC2, hbmOld2);
            DeleteDC(hDC2);
        }
        DeleteDC(hDC1);
    }
    return f;
}
 
HBITMAP ConvertTo24BppDIB(HBITMAP hbm)
{
    BITMAP bm;
    BITMAPINFOHEADER bi;
    LPVOID pvBits;
    HBITMAP hbmNew;
    DWORD cdw;
    LPBYTE pb;
 
    if (!GetObject(hbm, sizeof(BITMAP), &bm))
        return NULL;
 
    ZeroMemory(&bi, sizeof(BITMAPINFOHEADER));
    bi.biSize           = sizeof(BITMAPINFOHEADER);
    bi.biWidth          = bm.bmWidth;
    bi.biHeight         = bm.bmHeight;
    bi.biPlanes         = 1;
    bi.biBitCount       = 24;
    hbmNew = CreateDIBSection(NULL, (BITMAPINFO*)&bi, DIB_RGB_COLORS,
                              &pvBits, NULL, 0);
    if (hbmNew != NULL)
    {
        if (!CopyBitmapBits(hbmNew, hbm, bm.bmWidth, bm.bmHeight))
        {
            DeleteObject(hbmNew);
            hbmNew = NULL;
        }
    }
 
    return hbmNew;
}

24bpp DIBはカラーテーブルがなく、直接各ピクセルの色とアルファ値にアクセスでき、 透過処理が必要ないので、扱いやすいといえる。

ソース: 24bpp.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system