HBITMAP与BITMAP 的区别 BMP图像的格式

本文介绍了HBITMAP和BITMAP在Windows编程中的区别,HBITMAP是句柄,而BITMAP是实例。讨论了如何使用CBitmap::CreateBitmapIndirect函数创建位图,并指出当bmBits未设置时,通过GetDIBits获取位图的DIB格式数据。同时详细解析了BMP图像文件的四部分结构:位图文件头、位图信息头、调色板和图像数据。强调了位图数据的存储方式和对齐规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HBITMAP   是句柄;  
BITMAP    是实例:  

typedef struct tagBITMAP {  /* bm */
    int     bmType;//必须是BM
    int     bmWidth;//指定位图的宽度(以象素为单位)
    int     bmHeight;//指定位图的高度(以象素为单位)。
    int     bmWidthBytes;//一行几个字节,4位对齐
    BYTE    bmPlanes;//指定目标设备的位面数
    BYTE    bmBitsPixel;//指定每个象素的位数
    LPVOID  bmBits;//指向图象数据的指针

} BITMAP;

注意 bmBits是自己先前设置的  具体看下面复制的:

CBitmap::CreateBitmapIndirect函数的功能是用一个BITMAP结构体重的高度、宽度和位模式(如果指定了一个的话)来初始化一个位图。调用该函数时,用户可以设置bmBits字段为NULL或者设为像素位数据的地址(用以初始化该位图)。
复制自:http://bbs.youkuaiyun.com/topics/10310605

所以如果我们生成位图的时候没有设置bmBits  ,之后通过下面的 方法得到的bm结构中的bmBits是NULL   是无效的指针   

这时候我们可以通过GetDIBits获得bmp图像的DIB格式的数据.  我们传入的第6个参数 即LPBITMAPINFO  结构体会接收返回的位图信息 比如位图数据大小     具体见下面BITMAPINFOHEADER的解释 

    

windows不允许直接对用户对象操作,其操作得通过句柄来进行。  

例如:
  HBITMAP   hBmp;  
  BITMAP   bm;  
  GetObject(hBmp,sizeof(bm),&bm);  

通过HBITMAP取得BITMAP;

以下不是转载  而是个人理解  不对请指正:注意上面得到的bm是hBmp的信息  它表示的是hBmp的固有属性  假如它是与你的屏慕兼容的bmp   那么hBmp的信息记录的是屏幕位图的信息 不会改变。

GetDIBits 当你用位图去获取信息时,获取信息的位数 什么的 跟你传入的BITMAPINFO结构有关系 假如这个bmp已经被选入屏幕DC  你要获得屏幕的8位图像(256色) 而一般你的屏幕是32位  那么bm中存放的 bmBitsPixel是32   而你想到8位的话 就 需要在BITMAPINFO结构中设置 然后给GetDIBits作参数!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值