我正在使用以下方法创建反转位图:
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。 有什么方法既可以镜像位图又可以保留其颜色深度吗?
最佳答案
CreateBitmap
和 CreateDIBSection
将为您创建所需位数的位图,您仍然可以使用 DC 选择它们以接收结果。
关于c++ - 创建具有特定格式的位图以反转/镜像它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9099310/