我想在现有引擎中创建裁剪功能。这就是我已经拥有的:
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。
此代码的结果只是黑屏。
答案 0 :(得分:3)
永远不要从'新鲜'内存DC创建兼容的位图。 除非您想要创建1bpp位图 - 在新内存DC中选择的默认位图是1x1 1bpp位图 - 因此您创建的任何兼容位图都将匹配该位图。 这往往导致所有黑色输出。
你的hSrc中的颜色位图,所以使用那个 dc来制作新的位图。
答案 1 :(得分:3)
感谢您帮助我。 该功能现在完美无缺。
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;
}
答案 2 :(得分: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);
您可能需要进行更多检查以确保请求的区域符合原始位图的大小。