如何截取位图的一部分

wangshuiqing 2010-09-10 11:48:43
有一幅位图,想从中截取出某个矩形,存为另一幅位图。下面是我的代码,针对8位位图的,不知道哪里有问题,总是出现内存溢出

if (m_hBitmap==NULL)
return;
CRect rect;
rect.left=50;
rect.top=50;
rect.right=150;
rect.bottom=100;
int iWidth=rect.Width();
int iHeight=rect.Height();
int iBitCounts=8;
DWORD dwSize=iWidth*iHeight*iBitCounts/8;
BYTE* pNewImageBuffer=new BYTE[dwSize];

BITMAP bm;
::GetObject(m_hBitmap,sizeof(bm),(LPVOID)&bm);
m_bmWidth=bm.bmWidth;
m_bmHeight=bm.bmHeight;

BYTE* pOldImageBuffer=(BYTE*)(bm.bmBits);
int iWidthBytes=bm.bmWidthBytes;
BYTE* pNew=(BYTE*)pNewImageBuffer;
BYTE* pOld=(BYTE*)pOldImageBuffer;
pOld+=(bm.bmHeight-rect.bottom-1)*bm.bmWidthBytes;
for (int i=rect.bottom;i>=rect.top;i--)
{
for (int j=rect.left;j<=rect.right;j++)
{
*pNew=*(pOld+j);
pNew++;
}
if (i>rect.top)
pOld+=bm.bmWidthBytes;
}

CBitmap newBmp;
newBmp.CreateBitmap(iWidth,iHeight,1,iBitCounts,(void*)pNewImageBuffer);//到这里不管换成什么代码,只要涉及到new,即动态分配内存的,都会出现out of memory的那个对话框

CDC* pDC=m_picCtrl.GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CRect clientRect;
m_picCtrl.GetClientRect(clientRect);
CBitmap* pOldBitmap=MemDC.SelectObject(&newBmp);
pDC->BitBlt(100,100,clientRect.Width(),clientRect.Height(),&MemDC,0,0,SRCCOPY);//绘制位图
MemDC.SelectObject(pOldBitmap);
DeleteObject(newBmp);
ReleaseDC(&MemDC);
delete pNewImageBuffer;
...全文
61 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧