BYTE数组

wchlp 2009-12-07 05:30:59
在一个对话框的 opaint函数里 想放大显示bitmap,
其中 pParent->m_pImage就是用byte 数组保存 一个截屏位图的信息 BITMAPINFOHEADER bi,bi保存位图的信息。


CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
CBitmap display; CDC * memdc=new CDC;
CDC *pDC = GetDC();
=====================================================================================
//把BYTE数组转成bitmap,pParent->m_pImage是一个BYTE数组指针
bool test=display.CreateBitmap(bi.biWidth,bi.biHeight,bi.biPlanes,bi.biBitCount,pParent->m_pImage);
//返回的 test 值 是true 是不是表示转换成功
memdc->CreateCompatibleDC(pDC);
memdc->SelectObject(&display);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),memdc,0,0,bi.biWidth,bi.biHeight,SRCCOPY);//放大显示bitmap
/// 但是这里不显示。,对话框中没有图像被画出来

======================================================我改用
SetDIBitsToDevice(pDC->GetSafeHdc(),rect.left,rect.top,bi.biWidth,bi.biHeight,0,0,0,
bi.biHeight,pParent->m_pImage,(BITMAPINFO*)(&bi),DIB_RGB_COLORS);

则可以画出位图
...全文
363 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
因为你的目的窗口区域是用GetClientRect(rect);获得的,那么就限制了显示时的大小。


//将图像画到内存DC
StretchDIBits(memdc->GetSafeHdc(),0,0,1500,1500,0,0,bi.biWidth,bi.biHeight,pParent->m_pImage,(BITMAPINFO*)(&bi),DIB_RGB_COLORS,SRCCOPY);
//从内存DC拷贝到屏幕显示
dc.BitBlt(0,0,rect.Width(),rect.Height(),memdc,0,0,SRCCOPY);


这段代码是将bmp图片放大到1500*1500,如果原来图像是1024*1024的,那么就大约放大了1.5倍。
wchlp 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wchlp 的回复:]
引用 10 楼 wchlp 的回复:
引用 9 楼 gogdizzy 的回复:
上面代码假设数据是每个像素24bit的数据。


可以放大  但是 图片面目全非,红的变成了黑色。
不过谢谢了 ,我研究下你给的方法。如果还有好的办法  请再发我一下。


是这样吗?
StretchDIBits(memdc->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,bi.biWidth,bi.biHeight,pParent->m_pImage,(BITMAPINFO*)(&bi),DIB_RGB_COLORS,SRCCOPY)
[/Quote]

这样虽然 可以 但还是不能放大。没什么效果
wchlp 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wchlp 的回复:]
引用 9 楼 gogdizzy 的回复:
上面代码假设数据是每个像素24bit的数据。


可以放大  但是 图片面目全非,红的变成了黑色。
不过谢谢了 ,我研究下你给的方法。如果还有好的办法  请再发我一下。
[/Quote]

是这样吗?
StretchDIBits(memdc->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,bi.biWidth,bi.biHeight,pParent->m_pImage,(BITMAPINFO*)(&bi),DIB_RGB_COLORS,SRCCOPY)
  • 打赏
  • 举报
回复
你好,我觉得似乎是我说错了,由于我给的代码是从屏幕DC创建的兼容位图,似乎默认像素是32位的,不是24位。

建议你用StretchDIBits试试。这个函数需要一个BitmapInfo结构。
wchlp 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gogdizzy 的回复:]
上面代码假设数据是每个像素24bit的数据。
[/Quote]

可以放大 但是 图片面目全非,红的变成了黑色。
不过谢谢了 ,我研究下你给的方法。如果还有好的办法 请再发我一下。
fandh 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wchlp 的回复:]
引用 1 楼 yinfuyong 的回复:
你想问什么?



请教  想放大显示bitmap的方法。

[/Quote]
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),memdc,0,0,bi.biWidth,bi.biHeight,SRCCOPY);//放大显示bitmap
wchlp 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yinfuyong 的回复:]
你想问什么?
[/Quote]


请教 想放大显示bitmap的方法。
  • 打赏
  • 举报
回复
上面代码假设数据是每个像素24bit的数据。
  • 打赏
  • 举报
回复
试试这个呢。

[code=C/C++]
int nBytePerLine = (bi.Width * 3 + 3) / 4 * 4;
display.CreateCompatibleBitmap(&dc,bi.biWidth,bi.biHeight);
display.SetBitmapBits( nBytePerLine * bi.Height, pParent->m_pImage);
memdc->CreateCompatibleDC(&dc);
memdc->SelectObject(&display);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),memdc,0,0,bi.biWidth,bi.biHeight,SRCCOPY)

[code]
wchlp 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lfchen 的回复:]
// 你确定“把BYTE数组转成bitmap,pParent->m_pImage是一个BYTE数组指针 ”这部没有问题?
// 原来的BYTE数组个图像像素点的集合?

[/Quote]

就是有问题了,不敢确定。不过转换函数 返回值 是 true

bool test=display.CreateBitmap(bi.biWidth,bi.biHeight,bi.biPlanes,bi.biBitCount,pParent->m_pImage); 这里是true
一条晚起的虫 2009-12-08
  • 打赏
  • 举报
回复
// 你确定“把BYTE数组转成bitmap,pParent->m_pImage是一个BYTE数组指针 ”这部没有问题?
// 原来的BYTE数组个图像像素点的集合?
wchlp 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fandh 的回复:]
引用 3 楼 wchlp 的回复:
引用 1 楼 yinfuyong 的回复:
你想问什么?


请教  想放大显示bitmap的方法。


pDC->StretchBlt(0,0,rect.Width(),rect.Height(),memdc,0,0,bi.biWidth,bi.biHeight,SRCCOPY);//放大显示bitmap
[/Quote]


就是因为这个函数失效才 问的 。。请高手回答时,看下帖子 谢谢
xjtuzhw 2009-12-07
  • 打赏
  • 举报
回复
在线等问题
yinfuyong 2009-12-07
  • 打赏
  • 举报
回复
你想问什么?

19,468

社区成员

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

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