2

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

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。

此代码的结果只是黑屏。

4

3 回答 3

4

谢谢你帮助我。该功能现在完美运行。

bool Bitmap::Crop(RECT cropArea)
{
HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(hSrc);
HBITMAP hBmp = CreateCompatibleBitmap(hSrc, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

bool retVal = (BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY))?true:false;

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;

return retVal;
}
于 2010-09-08T21:20:26.427 回答
3

永远不要从“新”内存 DC 创建兼容的位图。除非您想创建 1bpp 位图 - 在新内存 DC 中选择的默认位图是 1x1 1bpp 位图 - 所以您创建的任何兼容位图都将匹配。这确实会导致全黑输出。

您在 hSrc 中的颜色位图,因此使用dc 来制作新位图。

于 2010-09-08T19:58:26.303 回答
2

两个小改动:

HBITMAP hBmp = CreateCompatibleBitmap(hNew, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 

BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY); 

您可能需要更多检查以确保请求的区域在原始位图的大小范围内。

于 2010-09-08T19:05:54.927 回答