首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >裁剪函数BitBlt(...)

裁剪函数BitBlt(...)
EN

Stack Overflow用户
提问于 2010-09-09 02:57:10
回答 3查看 4.7K关注 0票数 2

我想在现有的引擎中创建一个裁剪函数。这是我已经拥有的:

代码语言:javascript
复制
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。

这段代码的结果就是一个黑屏。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-09 03:58:26

永远不要从“新的”内存DC创建兼容的位图。除非你想创建一个1bpp的位图-在新的内存DC中选择的默认位图是一个1x1 1bpp的位图-这样你创建的任何兼容的位图都将与之匹配。这确实倾向于导致全黑输出。

您的颜色位图在hSrc中,所以使用该dc来制作新的位图。

票数 3
EN

Stack Overflow用户

发布于 2010-09-09 05:20:26

谢谢你帮我。该函数现在可以完美地工作了。

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2010-09-09 03:05:55

两个小变化:

代码语言:javascript
复制
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); 

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3671008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档