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

32bpp DIBに変換する

戻る


あるビットマップオブジェクトを32bppの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 ConvertTo32BppDIB(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       = 32;
    hbmNew = CreateDIBSection(NULL, (BITMAPINFO*)&bi, DIB_RGB_COLORS,
                              &pvBits, NULL, 0);
    if (hbmNew != NULL)
    {
        if (CopyBitmapBits(hbmNew, hbm, bm.bmWidth, bm.bmHeight))
        {
            if (bm.bmBitsPixel <= 24)
            {
                cdw = bm.bmWidth * bm.bmHeight;
                pb = (LPBYTE)pvBits;
                while(cdw--)
                {
                    pb++; pb++; pb++;
                    *pb++ = 0xFF;
                }
            }
        }
        else
        {
            DeleteObject(hbmNew);
            hbmNew = NULL;
        }
    }
 
    return hbmNew;
}

32bpp DIBはパディングもカラーテーブルもなく、 直接各ピクセルの色とアルファ値に連続してアクセスできるので、 他のビットマップ形式に比べ扱いやすい。 また、適切なアルファブレンドを行えば、透過処理もできるので、 表現力も高い。

ソース: 32bpp.zip


戻る

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

inserted by FC2 system