创建具有特定格式的位图以反转/镜像该位图



我使用以下方法创建一个倒置位图:

HBITMAP CreateMirroredBitmap( HBITMAP hbmOrig)
{
    HDC hdc, hdcMem1, hdcMem2;
    HBITMAP hbm = NULL, hOld_bm1, hOld_bm2;
    BITMAP bm;
    if (!hbmOrig)
        return NULL;
    if (!GetObject(hbmOrig, sizeof(BITMAP), &bm))
        return NULL;
    // Grab the screen DC.
    hdc = GetDC(NULL);
    if (hdc)
    {
        hdcMem1 = CreateCompatibleDC(hdc);
        if (!hdcMem1)
        {
            ReleaseDC(NULL, hdc);
            return NULL;
        }
        hdcMem2 = CreateCompatibleDC(hdc);
        if (!hdcMem2)
        {
            DeleteDC(hdcMem1);
            ReleaseDC(NULL, hdc);
            return NULL;
        }
        hbm = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight);
        if (!hbm)
        {
            ReleaseDC(NULL, hdc);
            DeleteDC(hdcMem1);
            DeleteDC(hdcMem2);
            return NULL;
        }
        // Flip the bitmap.
        hOld_bm1 = (HBITMAP)SelectObject(hdcMem1, hbmOrig);
        hOld_bm2 = (HBITMAP)SelectObject(hdcMem2 , hbm );
        SetLayout(hdcMem2, LAYOUT_RTL);
        BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem1, 0, 0, SRCCOPY);
        SelectObject(hdcMem1, hOld_bm1 );
        SelectObject(hdcMem1, hOld_bm2 );
        DeleteDC(hdcMem1);
        DeleteDC(hdcMem2);
        ReleaseDC(NULL, hdc);
    }
    return hbm;
}

取自此处:http://msdn.microsoft.com/en-us/goglobal/bb688119

问题是,无论我使用什么位图输入(8、16或32位颜色),它都将始终输出32位位图。我的猜测是CreateCompatibleBitmap创建默认的32位位图,因为我传递的DC是屏幕的32位DC。是否有任何方法可以镜像位图,同时保留其颜色深度?

CreateBitmapCreateDIBSection将为您创建请求比特率的位图,您仍然可以使用DC来选择它们以接收结果。

最新更新