HBITMAP与BITMAP 的区别 BMP图像的格式
来源:互联网 发布:spark 网页端口 编辑:程序博客网 时间:2024/06/05 06:12
HBITMAP
BITMAP
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.csdn.net/topics/10310605
所以如果我们生成位图的时候没有设置bmBits ,之后通过下面的 方法得到的bm结构中的bmBits是NULL 是无效的指针
这时候我们可以通过GetDIBits获得bmp图像的DIB格式的数据. 我们传入的第6个参数 即LPBITMAPINFO 结构体会接收返回的位图信息 比如位图数据大小 具体见下面BITMAPINFOHEADER的解释
windows不允许直接对用户对象操作,其操作得通过句柄来进行。
例如:
通过HBITMAP取得BITMAP;
以下不是转载 而是个人理解 不对请指正:注意上面得到的bm是hBmp的信息 它表示的是hBmp的固有属性 假如它是与你的屏慕兼容的bmp 那么hBmp的信息记录的是屏幕位图的信息 不会改变。
GetDIBits 当你用位图去获取信息时,获取信息的位数 什么的 跟你传入的BITMAPINFO结构有关系 假如这个bmp已经被选入屏幕DC 你要获得屏幕的8位图像(256色) 而一般你的屏幕是32位 那么bm中存放的 bmBitsPixel是32 而你想到8位的话 就 需要在BITMAPINFO结构中设置 然后给GetDIBits作参数!
BMP图像 以下是有部分信息是摘抄自其它网友的
由四部分组成:
A. 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构体,定义如下:
typedef struct tagBITMAPFILEHEADER{
}BITMAPFILEHEADER;
这个结构的长度是固定的,为14个字节(WORD为无符号16位二进制整数,DWORD为无符号32位二进制整数)。
B. 第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD
LONG
LONG
WORD
WORD
DWORD
LONG
LONG
DWORD
DWORD
} BITMAPINFOHEADER;
这个结构的长度是固定的,为40个字节(LONG为32为二进制整数)。
偏移域的名称长度/字节内容000Eh(14)biSize4C. 第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。真彩色图像不需要调色板,BITMAPINFOHEADER后直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
{
} RGBQUAD;
D.第四部分是实际的图像数据,对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图像,图像数据就是实际的R、G、B值:
• 对于2色位图:用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个
字节就可以表示8个像素;
• 对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素;
• 对于256色位图,一个字节刚好可以表示1个像素;
色深24位的位图
★
★
读取图像数据的方法:
HBITMAP hBmp = (HBITMAP)LoadImage( NULL , "z:\\bg4.bmp" , IMAGE_BITMAP , 0 , 0 , LR_CREATEDIBSECTION | LR_LOADFROMFILE); if (hBmp != NULL) { BITMAP bmp = {0}; int ret = GetObject( hBmp , sizeof(BITMAP) , &bmp ); if (ret) { TRACE( "Width = %d Height = %d BitsPerPixel = %d\n" , bmp.bmWidth , bmp.bmHeight , bmp.bmBitsPixel ); BYTE* pPixel = (BYTE*)bmp.bmBits; //指向BMP像素的指针 int x = 1439 , y = 899; //指定要获取像素的坐标 规定图片左上角坐标为0,0 BYTE *pOffset = pPixel + (bmp.bmHeight - 1) * bmp.bmWidthBytes; //指向最后一行像素数据 pOffset = (pOffset - y * bmp.bmWidthBytes) + x * bmp.bmBitsPixel / 8; //指向指定像素位置 DWORD rgb = 0; memcpy( &rgb , pOffset , bmp.bmBitsPixel / 8 ); TRACE( "(x = %d y = %d) = %u\n" , x , y , rgb ); } DeleteObject( hBmp ); hBmp = NULL; ZeroMemory( &bmp , sizeof(bmp) ); }//上面代码里的rgb就是你要的像素了//如果你是在对话框之类的处理的话可以用类似下面的代码实现CDC* pDc = GetDC(); POINT pt; pt.x = 10; pt.y = 10; pDc->SetPixel( pt , RGB(255,0,0) );
部分摘抄来自http://blog.sina.com.cn/s/blog_48f0f4da0100c3es.html
http://blog.sina.com.cn/s/blog_49dd59fe01011wbj.html
- HBITMAP与BITMAP 的区别 BMP图像的格式
- HBITMAP与BITMAP 的区别
- HBITMAP、CBitmap与BITMAP的区别与联系及转换
- HBITMAP、CBitmap与BITMAP的区别与联系及转换
- HBITMAP、CBitmap与BITMAP的区别与联系及转换
- HBitmap、Bitmap、CBitmap之间的区别与联系
- BMP图像的格式
- 得到桌面DC与获得抓屏的HBITMAP保存为bmp图像
- bmp格式图像的读取
- C++中Cbitmap,HBitmap,Bitmap的区别及联系
- png,bmp,jpg,gif格式图像的区别
- 视频图像学习[1]--CBitmap,HBitmap,Bitmap区别及联系
- BMP图像的格式及应用
- bmp 格式图像印刷体数字的识别
- bmp 格式图像印刷体数字的识别
- IPicture、BITMAP、HBITMAP和CBitmap的关系
- IPicture、BITMAP、HBITMAP和CBitmap的关系
- IPicture、BITMAP、HBITMAP和CBitmap的关系
- plot函数参数
- VS注释与取消注释快捷键
- JSON与XML的区别比较
- iOS通过iTunes search检测版本更新,并提示用户更新!
- asp.net微信公众平台开发
- HBITMAP与BITMAP 的区别 BMP图像的格式
- Digester解析xml详解
- bootstrap常用开源库,cdn加速
- libevent 的工作模型
- Eclipse启动,编译卡顿的解决办法
- C语言 realloc为什么要有返回值,realloc返回值详解/(解决任意长度字符串输入问题)。
- ArcGIS教程:了解成本距离分析
- J-LINK V8固件烧录指导
- 扩展KMP+hdu3613