CBitmap问题,急用

bitwwzhang130 2009-03-12 02:34:00
问题是这样的,如何利用一个已经存在的CBitmap指针去初始化一个CBitmap对象,而且保证原指针指向的内容不发生变化。
有没有效率比较高的做法?
急用啊!
...全文
241 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bitwwzhang130 的回复:]
我这样处理的,但是没有在原来的图上画啊,背景是黑色的。
CDC* pDC = m_pParentDlg->GetDC();
CDC MemDC;
CBitmap bitmap;
BITMAP Bmp;
MemDC.CreateCompatibleDC(pDC);
pBitmap->GetBitmap(&Bmp);
bitmap.CreateBitmapIndirect(&Bmp);
MemDC.SelectObject( bitmap );
为什么背景会是黑色的呢?
[/Quote]
GetBitmap并不返回像素数据,要根据位图大小用new分配内存,将指针保存在Bmp.bmBits中,再调用GetBitmapBits获取数据,然后再CreateBitmapIndirect,最后把前面分配的内存释放。
CDC* pDC = m_pParentDlg->GetDC();
CDC MemDC;
CBitmap bitmap;
BITMAP Bmp;
MemDC.CreateCompatibleDC(pDC);
pBitmap->GetBitmap(&Bmp);
Bmp.bmBits = new BYTE[Bmp.bmWidthBytes*Bmp.bmHeight];
pBitmap->GetBitmapBits(Bmp.bmWidthBytes*Bmp.bmHeight, Bmp.bmBits);
bitmap.CreateBitmapIndirect(&Bmp);
delete Bmp.bmBits;
CBitmap* oldBitmap = MemDC.SelectObject(bitmap);
// ……
MemDC.SelectObject(oldBitmap);
m_pParentDlg->ReleaseDC(pDC);
bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复
呵呵 明白了。开始时想错了,刚转过弯来。
谢谢A_KIM,linfenginnim_js_cn
A_KIM 2009-03-12
  • 打赏
  • 举报
回复

CDC* pDC = m_pParentDlg->GetDC();

// Add Start
CDC memOriginDC;
// Add End

CDC MemDC;
// bitmap 是目标位图
CBitmap bitmap;
BITMAP Bmp;
//MemDC.SetBkMode( TRANSPARENT );
MemDC.CreateCompatibleDC( pDC );
// m_pBitmap是源位图
m_pBitmap->GetBitmap( &Bmp );
bitmap.CreateBitmapIndirect( &Bmp );
MemDC.SelectObject( &bitmap );

// Add Start
// 装载源位图
memOriginDC.CreateCompatibleDC(pDC);
memOriginDC.SelectObject(m_pBitmap);
// 复制位图
MemDC.BitBlt(0, 0, Bmp.bmWidth, Bmp.bmHeight, &memOriginDC, 0, 0, SRCCOPY);
// Add End


// draw handles
DrawHandles( &MemDC, bDrawHandle );

// draw horizontal line
DrawHorizLine( &MemDC, vHorizInfo );

pDC->BitBlt( m_rectPic.left, m_rectPic.top, m_rectPic.Width(), m_rectPic.Height(),
&MemDC, 0, 0, SRCCOPY );

// release DC
m_pParentDlg->ReleaseDC( pDC );

bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复

CDC* pDC = m_pParentDlg->GetDC();

CDC MemDC;
// bitmap 是目标位图
CBitmap bitmap;
BITMAP Bmp;
//MemDC.SetBkMode( TRANSPARENT );
MemDC.CreateCompatibleDC( pDC );
// m_pBitmap是源位图
m_pBitmap->GetBitmap( &Bmp );
bitmap.CreateBitmapIndirect( &Bmp );
MemDC.SelectObject( &bitmap );


// draw handles
DrawHandles( &MemDC, bDrawHandle );

// draw horizontal line
DrawHorizLine( &MemDC, vHorizInfo );

pDC->BitBlt( m_rectPic.left, m_rectPic.top, m_rectPic.Width(), m_rectPic.Height(),
&MemDC, 0, 0, SRCCOPY );

// release DC
m_pParentDlg->ReleaseDC( pDC );

代码就是这样,就是在不改变pBitmap的情况下 在拷贝一份出来,然后在上面画线。
帮忙给看看啊
码农wuhb 2009-03-12
  • 打赏
  • 举报
回复
CDC* pDC = m_pParentDlg->GetDC();
CDC tagMemDC;
CDC MemDC;
CBitmap bitmap;
BITMAP Bmp;

MemDC.CreateCompatibleDC(pDC);
pBitmap->GetBitmap(&Bmp);
bitmap.CreateBitmapIndirect(&Bmp);
MemDC.SelectObject( bitmap );

//建立内存DC,把你的图片装进DC中
tagMemDC.CreateCompatibleDC(pDC);
tagMemDC.SelectObject(pBitmap);

// 把DC中的内容画到你的缓存中
MemDC.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &tagMemDC, 0, 0, SCCOPY);
A_KIM 2009-03-12
  • 打赏
  • 举报
回复
你代码写的不清楚啊,你注释写详细点.我根本看不出来哪个是源BITMAP.
我之前只是写个大概操作步骤....
bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 A_KIM 的回复:]
当然考贝出来拉,拷贝到了bitmap中.
。。。。。

tagMemDC --> MemDC
| |
源BITMAP 目标BITMAP
。。。。。
[/Quote]
这个是怎么实现的?我按你的代码试了,还是不行啊
A_KIM 2009-03-12
  • 打赏
  • 举报
回复
当然考贝出来拉,拷贝到了bitmap中.

BITMAP只是一个DC对象.如果你想把这个DC对象复制.
你需要一个虚拟或者实体的DC设备,通过DC设备来对DC对象操作.

所以,先建立tagMemDC,把复制源BITMAP加载进入.
然后,建立目标BITMAP -- bitmap,并且同样也建立DC -- MemDC

这样一来:

tagMemDC --> MemDC
| |
源BITMAP 目标BITMAP

你自己的贴出来的代码中,我看下来你想复制pBitmap
bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 A_KIM 的回复:]
C/C++ code
CDC* pDC = m_pParentDlg->GetDC();

CDC tagMemDC;

CDC MemDC;
CBitmap bitmap;
BITMAP Bmp;

MemDC.CreateCompatibleDC(pDC);
pBitmap->GetBitmap(&Bmp);
bitmap.CreateBitmapIndirect(&Bmp);
MemDC.SelectObject( bitmap );

// 建立内存DC,把你的图片装进DC中
tagMemDC.CreateCompatibleDC(pDC);
tagMemDC.SelectObject(pBitmap);
// 把DC中的内容画到你的缓存…
[/Quote]
这样不是等于还是在原来的位图上画吗?并没有拷贝出来一份新的啊?
A_KIM 2009-03-12
  • 打赏
  • 举报
回复

CDC* pDC = m_pParentDlg->GetDC();

CDC tagMemDC;

CDC MemDC;
CBitmap bitmap;
BITMAP Bmp;

MemDC.CreateCompatibleDC(pDC);
pBitmap->GetBitmap(&Bmp);
bitmap.CreateBitmapIndirect(&Bmp);
MemDC.SelectObject( bitmap );

// 建立内存DC,把你的图片装进DC中
tagMemDC.CreateCompatibleDC(pDC);
tagMemDC.SelectObject(pBitmap);
// 把DC中的内容画到你的缓存中
MemDC.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &tagMemDC, 0, 0, SCCOPY);


bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 A_KIM 的回复:]
兄弟,内存BITMAP创建好之后就是黑色的.你之前的代码仅仅创建了内存位图,但没有把目标图片中的内容花到内存位图中
[/Quote]
如何画到内存位图呢?
A_KIM 2009-03-12
  • 打赏
  • 举报
回复
兄弟,内存BITMAP创建好之后就是黑色的.你之前的代码仅仅创建了内存位图,但没有把目标图片中的内容花到内存位图中
bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复
剩下的代码就是 在上面画线,然后Bitblt到屏幕中
pDC->Bitblt( m_rectPic.left, m_rectPic.top, m_rectPic.width(), m_rectPic.height(), &MemDC, 0,0,SRCCOPY );
wutaihua 2009-03-12
  • 打赏
  • 举报
回复
你把你那个函数整个贴出来,我发觉你用的CDC是不对的,想用双缓冲,结果最后没有处理对。还有一个问题,就是bitmap你加载位图是否正确的问题。你肯定你已经把位图加载到了内存中间了吗
bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复
我这样处理的,但是没有在原来的图上画啊,背景是黑色的。

CDC* pDC = m_pParentDlg->GetDC();

CDC MemDC;
CBitmap bitmap;
BITMAP Bmp;

MemDC.CreateCompatibleDC(pDC);
pBitmap->GetBitmap(&Bmp);
bitmap.CreateBitmapIndirect(&Bmp);
MemDC.SelectObject( bitmap );

为什么背景会是黑色的呢?
bitwwzhang130 2009-03-12
  • 打赏
  • 举报
回复
给个例子吧!
现在已经在内存中有一个 CBitmap* pBitmap;
我想再复制一份,然后选到内存DC中,然后在上面画。而原来的CBitmap没有变。
cnzdgs 2009-03-12
  • 打赏
  • 举报
回复
是共享还是复制?如果是共享可以用Attach函数;如果是复制可以GetBitmap、CreateBitmapIndirect。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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