c++ - 创建具有特定格式的位图以反转/镜像它

标签 c++ winapi visual-c++

我正在使用以下方法创建反转位图:

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 选择它们以接收结果。

关于c++ - 创建具有特定格式的位图以反转/镜像它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9099310/

相关文章:

c++ - 打印机端口设置

c# - 来自 C# 的 Runas/NETONLY

c++ - 如何从应用程序所在的同一文件夹运行 exe

C++/CLI 和编译器选择

c++ - 如何知道使用 valgrind 运行应用程序时使用的内存大小?

c++ - PCL loadPCDFile() 错误

c++ - 如何通过 Windows API 获取所有(非禁用)用户 SID?

c++ - 在 visual studio 中包含相对于 props 文件的路径

visual-studio - 哪些 Visual C++ 文件类型应提交版本控制?

java - c++ 可以做这个 java 构建器模式吗?