我想在现有的引擎中创建一个裁剪函数。这是我已经拥有的:
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。
这段代码的结果就是一个黑屏。
发布于 2010-09-09 03:58:26
永远不要从“新的”内存DC创建兼容的位图。除非你想创建一个1bpp的位图-在新的内存DC中选择的默认位图是一个1x1 1bpp的位图-这样你创建的任何兼容的位图都将与之匹配。这确实倾向于导致全黑输出。
您的颜色位图在hSrc中,所以使用该dc来制作新的位图。
发布于 2010-09-09 05:20:26
谢谢你帮我。该函数现在可以完美地工作了。
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-09 03:05:55
两个小变化:
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); 您可能需要更多的检查,以确保请求的区域落在原始位图的大小内。
https://stackoverflow.com/questions/3671008
复制相似问题