CBitmap、HBITMAP、BITMAP相互转换

一:理解

BITMAP是C++中定义的位图结构体

HBITMAP是Windows中使用的位图句柄

CBitmap是MFC封装的位图类

二:相互转换

1、HBITMAP->CBitmap

HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap bitmap;
bitmap.Attach(hBitmap);

实验源码,在(OnPaint函数中添加)

CString str = _T("E:\\picture\\lena.bmp");
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap bitmap;
bitmap.Attach(hBitmap);
CPaintDC dc(this);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);

注意:CBitmap类中的成员函数:

BOOL LoadBitmap(LPCTSTR lpszRecourceName);   
BOOL LoadBitmap(UINT nIDResource);

都可以加载位图,但他们只能加载工程中的位图,不能像LoadImage一样,加载硬盘中的位图。尤其要注意:

BOOL LoadBitmap(LPCTSTR lpszRecourceName)函数中的lpszRecourceName不能为路径字符串。它指的是位图的ID是用字符串表示的。

比如:我在工程中创建了一个位图资源IDB_BITMAP1 ,lpszResourceName是指什么呢,是硬盘上的bitmap1.bmp吗,如果是,以下代码为什么是错的。

CBitmap   bmp;
bmp.LoadBitmap("d:\\..\\res\\bitmpa1.bmp");
CDC   memdc;
BITMAP   bm;
bmp.GetBitmap(&bm);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bmp);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memdc,0,0,SRCCOPY);  

用Notepad打开*.rc文件,找到类似下面一行:

IDB_BITMAP   BITMAP   "res\\background.bmp"   
改成:Bitmap1   BITMAP   "res\background.bmp"   
或者,在VC中察看位图资源的属性,将其ID栏内改为"Bitmap"(注意,一定要加引号)。
然后调用:bmp.LoadBitmap("Bitmap1"); 保证成功。   
资源可以用一个整数来标示,也可以用一个字符串标示。但无论如何,这些ID都不是指位图文件名。

2、HBITMAP->BITMAP

CString str = _T("E:\\picture\\lena.bmp");
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
BITMAP bm;
::GetObject(hBitmap, sizeof(bm), &bm);

3、CBitmap->BITMAP

CBitmap bitmap;
bitmap.LoadBitmapW(IDB_BITMAP1);
BITMAP bm;
bitmap.GetBitmap(&bm);

4、CBitmap->HBITMAP

时间: 2024-10-25 13:13:49

CBitmap、HBITMAP、BITMAP相互转换的相关文章

C++ CBitmap,HBitmap,Bitmap区别及联系

加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad): LoadImage可以用来加载位图,图标和光标 加载时可以规定加载图的映射到内存的大小: cxDesired:指定图标或光标的宽度,以像素为单位.如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度.

android Base64字符串与Bitmap相互转换

/** * 将bitmap转换成base64字符串 * * @param bitmap * @return base64 字符串 */ public String bitmaptoString(Bitmap bitmap, int bitmapQuality) { // 将Bitmap转换成字符串 String string = null; ByteArrayOutputStream bStream = new ByteArrayOutputStream(); bitmap.compress(C

[ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]

场景: 1. 在做图片处理时,比方放大后或加特效后须要保存CBitmap(HBITMAP)到文件. 2.截取屏幕内容到文件时. 3.不须要增加第3方库时. 说明: 这段代码部分来自网上.第一次学atl/wtl.gdi不是非常熟悉.以后转换为wtl版本号吧. 当然wtl项目直接用也没问题. 如今想想wxWidgets的wxImage类对这类操作方便多了.仅仅须要调用一个SaveFile方法. 保存HBITMAP到文件: static bool SaveBitmapToFile(CBitmap& b

[ATL/WTL]_[保存CBitmap到文件-保存屏幕内容到文件]

场景: 1. 在做图片处理时,比如放大后或加特效后需要保存CBitmap(HBITMAP)到文件. 2.截取屏幕内容到文件时. 3.不需要加入第3方库时. 说明: 这段代码部分来自网上,第一次学atl/wtl,gdi不是很熟悉,以后转换为wtl版本吧.当然wtl项目直接用也没问题. 现在想想wxWidgets的wxImage类对这类操作方便多了.只需要调用一个SaveFile方法. 保存HBITMAP到文件: static bool SaveBitmapToFile(CBitmap& bitma

根据图像路径,创建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参数是文件路径名,但经过尝

QPixmap 和 HBITMAP互转

Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat = 0); 声明这一句后, 就可以使用了 HBITMAP hBmp =  qt_pixmapToWinHBITMAP(pix, 2); 该函数定义在qpixmap_win.cpp下 还有一些其他的实用函数 Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbi

WPF Image控件中的ImageSource与Bitmap的互相转换

1.从bitmap转换成ImageSource [DllImport("gdi32.dll", SetLastError = true)] private static extern bool DeleteObject(IntPtr hObject); /// <summary> /// 从bitmap转换成ImageSource /// </summary> /// <param name="icon"></param&g

MFC基础控件

一.静态文本 在代码中动态创建,需要使用CStatic类的成员函数Create virtual BOOL Create(    LPCTSTR lpszText,    DWORD dwStyle,    const RECT& rect,    CWnd* pParentWnd,    UINT nID = 0xffff  ); lpszText:指定要在控件中显示的文字.如果为NULL则不会显示任何文字. dwStyle:指定静态控件的风格.静态文本框一般都是对话框或其他窗口的子窗口,而且是

透明位图的显示 作者:王骏

透明位图的显示作者:王骏 http://www.vckbase.com/document/viewdoc/?id=532 下载本文示例代码 包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图.本文将介绍动态生成掩码位图绘制具有透明区域位图的方法. 一.TransparentBlt 函数的使用  TransparentB