在内存中缩放bmp文件

beyonld 2010-01-07 04:27:06
首先,从将bmp文件导入到DC中,然后在内存中进行缩放,最后将缩放后的图片保存到bmp文件
一切操作都在内存中进行,图片不显示出来,请问如何实现?


CClientDC dc(this);//显示DC,只是想用来查看得到的DC是不是我想要的
CDC pScreenDc;//我真正想要的DC,其图片大小为192x192大小
pScreenDc.CreateCompatibleDC(NULL);
CDC pMemDc;//内存DC,用来存放导入的BMP文件
pMemDc.CreateCompatibleDC(NULL);

HBITMAP hBitMap = (HBITMAP)::LoadImage(NULL, BmpFilePath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

//////////////////////////////////
CBitmap BitMap;
BitMap.Attach(hBitMap);
BITMAP bBitmap;
BitMap.GetBitmap(&bBitmap);
//////////////////////////////////

pMemDc.SelectObject(&hBitMap);

//缩放图片,缩放大小为192x192
pScreenDc.SetStretchBltMode(HALFTONE);
pScreenDc.StretchBlt(0, 0, 192, 192, &pMemDc, 0, 0, bBitmap.bmWidth, bBitmap.bmHeight, SRCCOPY);

dc.BitBlt(0, 0, theApp.m_ScreenWidth, theApp.m_ScreenHeight, &pScreenDc, 0, 0, SRCCOPY);

上面的代码执行后,在界面上显示不出缩放后的图片,跟踪执行到StretchBlt返回0,缩放失败,是不是StretchBlt不支持内存缩放?那要达到我的目的,应该怎么修改代码?
...全文
299 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsvine 2010-01-07
  • 打赏
  • 举报
回复
找段双缓冲的代码看一下 很快就明白了
icefairy 2010-01-07
  • 打赏
  • 举报
回复

void CtesttttttDlg::OnPaint()
{

CPaintDC dc(this);

CBitmap m_Bitmap;
m_Bitmap.LoadBitmap(IDB_Gugong);

BITMAP m_bitmapInfo;
m_Bitmap.GetBitmap(&m_bitmapInfo);

CDC memDC;
memDC.CreateCompatibleDC(&dc);

//CRect rect;
//GetWindowRect(&rect);
//memDC.DrawText("dfdfdfd",rect,0);

CBitmap *pOldBmp=memDC.SelectObject(&m_Bitmap);


// dc.BitBlt(0,0,m_bitmapInfo.bmWidth,m_bitmapInfo.bmHeight,&memDC,0,0,SRCCOPY);
dc.StretchBlt(0,0,m_bitmapInfo.bmWidth,m_bitmapInfo.bmHeight,&memDC,0,0,500,500,SRCCOPY);

memDC.SelectObject(pOldBmp);
}



StretchBlt就可以实现缩放了吧
Ryanwen 2010-01-07
  • 打赏
  • 举报
回复
改了下 可以显示图像

CPaintDC dc(this);//显示DC,只是想用来查看得到的DC是不是我想要的
CDC pScreenDc;//我真正想要的DC,其图片大小为192x192大小
pScreenDc.CreateCompatibleDC(&dc);
CDC pMemDc;//内存DC,用来存放导入的BMP文件
pMemDc.CreateCompatibleDC(&dc);

CRect rcClient;
GetClientRect(&rcClient);

CBitmap hScreenBitmap;
hScreenBitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
CBitmap *pOldMap = pScreenDc.SelectObject(&hScreenBitmap);

HBITMAP hBitMap = (HBITMAP)::LoadImage(NULL, "C:\\asd.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

//////////////////////////////////
CBitmap BitMap;
BitMap.Attach(hBitMap);
BITMAP bBitmap;
BitMap.GetBitmap(&bBitmap);
//////////////////////////////////

pMemDc.SelectObject(&BitMap); //这个地方直接用CBitmap

//缩放图片,缩放大小为192x192
pScreenDc.SetStretchBltMode(HALFTONE);
pScreenDc.StretchBlt(0, 0, 192, 192, &pMemDc, 0, 0, bBitmap.bmWidth, bBitmap.bmHeight, SRCCOPY);


dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &pScreenDc, 0, 0, SRCCOPY);
beyonld 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 happyparrot 的回复:]
hScreenBitmap.CreateCompatibleBitmap(&pScreenDc, 192, 192);
这个不对啊,是
hScreenBitmap.CreateCompatibleBitmap(&dc, 192, 192);
[/Quote]
谢谢
快乐鹦鹉 2010-01-07
  • 打赏
  • 举报
回复
hScreenBitmap.CreateCompatibleBitmap(&pScreenDc, 192, 192);
这个不对啊,是
hScreenBitmap.CreateCompatibleBitmap(&dc, 192, 192);
beyonld 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 happyparrot 的回复:]
引用 7 楼 beyonld 的回复:
引用 3 楼 happyparrot 的回复:
给pScreenDc加一个兼容位图

pScreenDc.CreateCompatibleDC(dc)这样加的,也不行。。StretchBlt一直返回0

你没有加兼容位图啊。这只是创建兼容DC而已。
[/Quote]
哦,不好意思,看错了,这个我最开始都加了,代码如下:
CBitmap hScreenBitmap;
hScreenBitmap.CreateCompatibleBitmap(&pScreenDc, 192, 192);
CBitmap *pOldMap = pScreenDc.SelectObject(&hScreenBitmap);
但是显示出来是黑的一块,不知道缩放成功与否
快乐鹦鹉 2010-01-07
  • 打赏
  • 举报
回复
pScreenDc.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,192,192);
pScreenDc.SelectObject(&bmp);
beyonld 2010-01-07
  • 打赏
  • 举报
回复
有没有别的方法能实现:导入一个BMP文件到内存,然后将其缩放到指定大小的BITMAP,我只要这个BITMAP就行了,GDI+也行,怎么实现?给个方向,我查资料学习去,谢谢先
快乐鹦鹉 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 beyonld 的回复:]
引用 3 楼 happyparrot 的回复:
给pScreenDc加一个兼容位图

pScreenDc.CreateCompatibleDC(dc)这样加的,也不行。。StretchBlt一直返回0
[/Quote]
你没有加兼容位图啊。这只是创建兼容DC而已。
icefairy 2010-01-07
  • 打赏
  • 举报
回复
不变 大小 可以正常显示吗?
beyonld 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyparrot 的回复:]
给pScreenDc加一个兼容位图
[/Quote]
pScreenDc.CreateCompatibleDC(dc)这样加的,也不行。。StretchBlt一直返回0
vclongking 2010-01-07
  • 打赏
  • 举报
回复
感觉是要加一个兼容DC
关注学习哈
beyonld 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sandyandy 的回复:]
pScreenDc.CreateCompatibleDC(dc.m_hDC);
[/Quote]
一样,不行,主要是pScreenDc和pMemDc这二个绘图(只要将图片缩放就行),dc只是显示出pScreenDc看绽放后的图片对不对,要不要无所谓
icefairy 2010-01-07
  • 打赏
  • 举报
回复
pMemDc.CreateCompatibleDC(&pScreenDc); 好像是这个
快乐鹦鹉 2010-01-07
  • 打赏
  • 举报
回复
给pScreenDc加一个兼容位图
icefairy 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sandyandy 的回复:]
pScreenDc.CreateCompatibleDC(dc.m_hDC);
[/Quote]

up
sandyandy 2010-01-07
  • 打赏
  • 举报
回复
pScreenDc.CreateCompatibleDC(dc.m_hDC);

19,468

社区成员

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

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