我想在现有引擎中创建裁剪功能。这就是我已经拥有的:

bool Bitmap::Crop(RECT cropArea)
{
BITMAP bm;
GetObject(m_Handle, sizeof(bm), &bm);

HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(NULL);
HBITMAP hBmp = CreateCompatibleBitmap(hNew, bm.bmWidth, bm.bmHeight);
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

BitBlt(hNew, 0, 0, bm.bmWidth, bm.bmHeight, hSrc, 0, 0, SRCCOPY);

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;
}

我希望它只是将整个图像复制到新的HBITMAP中,并用它替换旧的图像。所以我知道它有效。之后,它只是在使用BitBlt参数。

m_Handle是类Bitmap的HBITMAP。

该代码的结果只是一个黑屏。

最佳答案

切勿从"new"存储器DC创建兼容的位图。
除非您要创建1bpp位图-否则在新内存DC中选择的默认位图是1x1 1bpp位图-因此您创建的任何兼容位图都将匹配。
的确会导致全黑输出。

您的颜色位图位于hSrc中,因此请使用该dc制作新的位图。

关于c++ - 裁剪功能BitBlt(…),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3671008/

10-15 06:08