CBitmap转CImage问题

acrobatyuer 2010-10-22 06:32:15
我想用内存DC是构建个CImage图像,不知道怎么做啊!

之前用CImage的Attach方法去创建,但是好像不行哦!谁有办法把内存的DC给转成CImage类型的对象。
...全文
851 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-11-19
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖

相关规定详见界面界面版关于版主结帖工作的具体办法
lilingshui 2010-10-23
  • 打赏
  • 举报
回复
应该与一副位图同时只能选入一个dc有关,在CImage 中也一样,要不试着再创建一个CBitmap对象,其内容与内存DC的位图一样,或在调用Attach之前让内存DC先选回旧的CBitmap,TransparentBlt之后让CImage detach掉,然后让内存dc选回bitmap对象。
向立天 2010-10-23
  • 打赏
  • 举报
回复
没道理啊
不过我倒也没有用CImage绘图
直接存文件了
但是原理是一样的
acrobatyuer 2010-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xianglitian 的回复:]

Attach可以啊
我就是这么用的

C/C++ code
CDC* pMemDC = new CDC;
//创建位图内存
bitmapTemp.CreateCompatibleBitmap(pDC, m_nWidth, m_nHight);
pMemDC->CreateCompatibleDC(pDC)……
[/Quote]

但是我这么用之后CImage对象是没有办法绘图的。只要一调用TransparentBlt方法就崩溃了。
libinfei8848 2010-10-22
  • 打赏
  • 举报
回复
SelectObject
向立天 2010-10-22
  • 打赏
  • 举报
回复
Attach可以啊
我就是这么用的

		CDC*	pMemDC		= new CDC;
//创建位图内存
bitmapTemp.CreateCompatibleBitmap(pDC, m_nWidth, m_nHight);
pMemDC->CreateCompatibleDC(pDC);
pOldBitmap = pMemDC->SelectObject(&bitmapTemp);
imageSave.Attach((HBITMAP)bitmapTemp.GetSafeHandle());
visualwind 2010-10-22
  • 打赏
  • 举报
回复

HBITMAP hBitmap = (HBITMAP)GetCurrentObject(hDC, OBJ_BITMAP);

CImage::FromHandle(hBitmap);
实现对BMP图像的读取,放大,缩小。HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio) { // 源图像的宽度和高度 LONG lWidth; LONG lHeight; // 缩放后图像的宽度和高度 LONG lNewWidth; LONG lNewHeight; // 缩放后图像的宽度(lNewWidth',必须是4的倍数) LONG lNewLineBytes; // 指向源图像的指针 LPSTR lpDIBBits; // 指向源象素的指针 LPSTR lpSrc; // 缩放后新DIB句柄 HDIB hDIB; // 指向缩放图像对应象素的指针 LPSTR lpDst; // 指向缩放图像的指针 LPSTR lpNewDIB; LPSTR lpNewDIBBits; // 指向BITMAPINFO结构的指针(Win3.0) LPBITMAPINFOHEADER lpbmi; // 指向BITMAPCOREINFO结构的指针 LPBITMAPCOREHEADER lpbmc; // 循环变量(象素在新DIB中的坐标) LONG i; LONG j; // 象素在源DIB中的坐标 LONG i0; LONG j0; // 图像每行的字节数 LONG lLineBytes; // 找到源DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 获取图像的宽度 lWidth = ::DIBWidth(lpDIB); // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); // 获取图像的高度 lHeight = ::DIBHeight(lpDIB); // 计算缩放后的图像实际宽度 // 此处直接加0.5是由于强制类型换时不四舍五入,而是直接截去小数部分 lNewWidth = (LONG) (::DIBWidth(lpDIB) * fXZoomRatio + 0.5); // 计算新图像每行的字节数 lNewLineBytes = WIDTHBYTES(lNewWidth * 8); // 计算缩放后的图像高度 lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5); // 分配内存,以保存新DIB hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 判断是否内存分配失败 if (hDIB == NULL) { // 分配内存失败 return NULL; } // 锁定内存 lpNewDIB = (char * )::GlobalLock((HGLOBAL) hDIB); // 复制DIB信息头和调色板 memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 找到新DIB象素起始位置 lpNewDIBBits = ::FindDIBBits(lpNewDIB); // 获取指针 lpbmi = (LPBITMAPINFOHEADER)lpNewDIB; lpbmc = (LPBITMAPCOREHEADER)lpNewDIB; // 更新DIB中图像的高度和宽度 if (IS_WIN30_DIB(lpNewDIB)) { // 对于Windows 3.0 DIB lpbmi->biWidth = lNewWidth; lpbmi->biHeight = lNewHeight; } else { // 对于其它格式的DIB lpbmc->bcWidth = (unsigned short) lNewWidth; lpbmc->bcHeight = (unsigned short) lNewHeight; } // 针对图像每行进行操作 for(i = 0; i < lNewHeight; i++) { // 针对图像每列进行操作 for(j = 0; j < lNewWidth; j++) { // 指向新DIB第i行,第j个象素的指针 // 注意

15,979

社区成员

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

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