mfc 显示位图

从资源中加载是:
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP1)

从文件中加载是,注意加载的是位图即bmp文件。
    CBitmap bitmap;
    bitmap.m_hObject=(HBITMAP)::LoadImage(NULL,"test.bmp",IMAGE_BITMAP,500,400,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
这里需要注意的是从文件加载位图,并不是通过调用CBitmap的成员函数完成。
而是使用SDK函数LoadImage,通过将其返回值赋值给CBitmap的成员变量m_hObject而完成对CBitmap的对象的赋值过程。

此处的强制类型可以不使用,使用是强调的意思。

 

可以把图像文件中的图像内容加载到CBitmap类中。支持格式:BMP、JPG、GIF和PNG。

  CImage imgTemp;
  imgTemp.Load(strFilePath);
  if ( pBitmap->m_hObject ) pBitmap->Detach();
  pBitmap->Attach(imgTemp.Detach());

 

 但是在vc6中没有CImage这个类,在NET2005+平台中的c++有。使用这个类首先要在stdafx.h中添加 #include <atlimage.h>。

 

如果用stretchBlt,当目的区域比源区域小的时候,看起来会感觉明显的失真。要比过大的失真程度明显


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是将MFC 24位图转换为单色位图的示例代码: CBitmap bmp24; bmp24.LoadBitmap(IDB_BITMAP24); //加载24位图 BITMAPINFO bmi24; ZeroMemory(&bmi24, sizeof(BITMAPINFO)); //清空结构体 bmi24.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmp24.GetBitmap(&bmi24.bmiHeader, sizeof(BITMAPINFOHEADER)); //获取24位图像素信息 //创建单色位图 BITMAPINFO bmi1; ZeroMemory(&bmi1, sizeof(BITMAPINFO)); bmi1.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi1.bmiHeader.biWidth = bmi24.bmiHeader.biWidth; bmi1.bmiHeader.biHeight = bmi24.bmiHeader.biHeight; bmi1.bmiHeader.biPlanes = 1; bmi1.bmiHeader.biBitCount = 1; bmi1.bmiHeader.biCompression = BI_RGB; //计算单色位图像素信息 BYTE* pBits24 = new BYTE[bmi24.bmiHeader.biSizeImage]; bmp24.GetBitmapBits(bmi24.bmiHeader.biSizeImage, pBits24); BYTE* pBits1 = new BYTE[bmi1.bmiHeader.biSizeImage]; int rowWidth24 = ((bmi24.bmiHeader.biWidth * 24 + 31) / 32) * 4; int rowWidth1 = ((bmi1.bmiHeader.biWidth * 1 + 31) / 32) * 4; for (int y = 0; y < bmi24.bmiHeader.biHeight; y++) { for (int x = 0; x < bmi24.bmiHeader.biWidth; x++) { int index24 = y * rowWidth24 + x * 3; int index1 = y * rowWidth1 + x / 8; BYTE gray = (BYTE)(0.299 * pBits24[index24 + 2] + 0.587 * pBits24[index24 + 1] + 0.114 * pBits24[index24]); //计算灰度值 BYTE bit = gray > 128 ? 0 : 1; //将灰度值转为二值图像 pBits1[index1] |= (bit << (7 - x % 8)); //将二值图像写入单色位图 } } //创建单色位图 CBitmap bmp1; bmp1.CreateBitmapIndirect(&bmi1, pBits1); //释放内存 delete[] pBits24; delete[] pBits1; //显示单色位图 CDC* pDC = GetDC(); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap* pOldBmp = memDC.SelectObject(&bmp1); pDC->BitBlt(0, 0, bmi1.bmiHeader.biWidth, bmi1.bmiHeader.biHeight, &memDC, 0, 0, SRCCOPY); memDC.SelectObject(pOldBmp); ReleaseDC(pDC);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值