CBitmap的使用

MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建、图像数据的获取等功能。虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以胜任的。很多人可能会采用一些现成的CDib类进行位图的读取与处理,我觉得必要性不大。因为他们完成的功能差不多。

以下假设定义了数据成员:

CBitmap m_bitmap;

(1) 位图的读取

void LoadImage(CString fileName)
{
HBITMAP m_hBitmap;//位图句柄
BITMAP bm;//存放位图信息的结构

m_hBitmap = (HBITMAP)::LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //装载位图
if(m_bitmap.m_hObject)
m_bitmap.DeleteObject();
m_bitmap.Attach(m_hBitmap);//将句柄与CBitmap关联起来
m_bitmap.GetBitmap(&bm);
height = bm.bmHeight;//图像的宽高
width = bm.bmWidth;

widthBytes=bm.bmWidthBytes;//图像一行数据所占的字节数

}

(2) 位图的显示

在OnDraw()或OnPaint()函数中调用:

//dx0,dy0,dx,dy为显示目标位置的坐标和大小,

//sx0,sy0,sx,sy为图像要显示部分的起始坐标和大小

void DrawImage(int dx0, int dy0, int dx, int dy, int sx0, int sy0, int sx, int sy)

{ if(!m_bitmap.m_hObject)
return;

CClientDC dc(this);

CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pbmpOld = memDC.SelectObject(&m_bitmap);

dc.SetStretchBltMode(COLORONCOLOR);//设置拉伸模式,否则图像会不清晰
dc.StretchBlt(dx0,dy0,dx,dy,&memDC,sx0,sy0,sx,sy,SRCCOPY);//绘制图像
memDC.SelectObject(pbmpOld);
memDC.DeleteDC();

}

(3) 位图数据的获取

以灰度转化为例:

int size=height*widthBytes;
BYTE *lpBits=new BYTE[size];
m_bitmap.GetBitmapBits(size,lpBits);//得到RGB数据

BYTE *lpGray=new BYTE[height*width];

int R, G, B;

for(int i=0;i<height;i++)

for(int j=0;j<width;j++)

{

B=lpBits[i*widthBytes+j*4];

G=lpBits[i*widthBytes+j*4+1];

R=lpBits[i*widthBytes+j*4+2];

lpGray[i*width+j]=(B+G+R)/3;//转化为灰度

}

...

delete []lpBits;

delete []lpGray;

时间: 2025-01-21 16:37:47

CBitmap的使用的相关文章

C++中Cbitmap,HBitmap,Bitmap区别及联系

  这篇文章主要介绍了C++中Cbitmap,HBitmap,Bitmap区别及联系的相关资料,需要的朋友可以参考下 加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad); LoadImage可以用来加载位图,图标和光标 加载时可以规定加载图的映射到内存的大小: cxDesired:指定图标或光标的宽度,以

IPicture、BITMAP、HBITMAP和CBitmap的关系

1.有关IPicture加载图片后直接Render到内存DC的问题(HBITMAP转换IPicture)Picture的方法get_Handle可以直接得到图片的句柄 IPicture *pIPicture;HBITMAP hBitmap;...pIPicture->get_Handle((OLE_HANDLE *)&hBitmap); 2.CBitmap 转换 HBITMAPCBitmap m_bitMap;HBITMAP m_hBitMap;m_bitMap.LoadBitmap(IDB

cbitmap 获取RGB CBitMap的用法

MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建.图像数据的获取等功能.虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以胜任的.很多人可能会采用一些现成的CDib类进行位图的读取与处理,我觉得必要性不大.因为他们完成的功能差不多.     以下假设定义了数据成员:     CBitmap m_bitmap; (1) 位图的读取 void LoadImage(CString fileName) { HBITMAP m_hBitmap;//位图句

根据图像路径,创建CBitmap对象的方法

 因为项目的关系,需要根据图像路径,创建CBitmap对象.起初查资料找到了LoadBitmap这个函数,根据CSDN得 BOOL LoadBitmap ( LPCTSTR lpszResourceName ); Parameters lpszResourceName:Points to a null-terminated string that contains the name of the bitmap resource.   以为这里的lpszResourceName参数是文件路径名,但

C++将CBitmap类中的图像保存到文件的方法_C 语言

本文实例讲述了C++将CBitmap类中的图像保存到文件的方法.分享给大家供大家参考.具体实现方法如下: 使用下面的代码,可以把CBitmap类中的图像保存到图像文件中.支持格式:BMP.JPG.GIF和PNG. void SaveBitmap(CString strFilePath, CBitmap Bitmap) { if ( Bitmap.m_hObject ) { CImage imgTemp; // CImage是MFC中的类. imgTemp.Attach(Bitmap.operat

bitmap c# c++-C#处理C++的的返回值Cbitmap*生成图像在控件中显示

问题描述 C#处理C++的的返回值Cbitmap*生成图像在控件中显示 Cbitmap* userGetBitmap(HWND hwnd,int nBMPWIDTH,int nBMPHEIGHT): hwnd需要显示当前图像的窗口句柄 nBMPWIDTH 需要生成的图像的像素宽度 nBMPHEIGHT需要生成的图像的像素高度 C++的DLL中有如上函数,请问,用C#如何接招.如何用C#要根据上面的函数生成一个图片并在控件中显示. 解决方案 Cbitmap* userGetBitmap(HWND

vc的CBitmap怎么导入ZPixmap格式的图片?

问题描述 如题,谢谢.. 解决方案 解决方案二:比如已知有UINT8*data指向存储该图片的首地址,大小为width*height,怎么用它初始化一个CBitmap解决方案三:CBitmap只能用于BMP格式,其他格式要用CImage或Gdi+解决方案四:你知道该位图的头文件结构吗?自已可以做个转换.是压缩的吗?如果是的话,还需要自己编个解压算法.

VC++中图像处理类CBitmap的用法_C 语言

VC++中图像处理类CBitmap的用法 class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHandle(HBITMAP hBitmap); // Constructors CBitmap(); BOOL LoadBitmap(LPCTSTR lpszResourceName); BOOL LoadBitmap(UINT nIDResource); BOO

位图显示-MFC中OnPaint函数显示BMP图片的问题

问题描述 MFC中OnPaint函数显示BMP图片的问题 为什么我在MFC对话框中,在OnPaint函数中加入以下代码,BMP图像不能显示啊~~· BITMAP bm; CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); CDC memdc; CDC dc; memdc.CreateCompatibleDC(&dc);/ bmp.GetBitmap(&bm); CBitmap *bmpold=memdc.SelectObject(&bmp);/ dc