BMP位图格式的内存存储方式
最近在捣鼓Kinect 存储的 raw data,使用 kinect输出并保存红外数据流 ColorImageFormat.InfraredResolution640x480Fps30。其红外数据流的像素格式指定为 PixelFormats.Gray16,但使用C#图像保存接口后,保存的BMP文件为64位。我们清楚 Gray8,Gray24,Gray32的实际含义,但是64位的BMP没有见过。
在C# WPF工程中,查看数据格式和内存空间,能够知道Gray16是用 2 bytes来表示一个像素的亮度值,可是保存成 64位BMP后图像数据是怎么组织的呢???
首先,有必要弄清楚 BMP位图格式的存储原理。
将BMP文件用16进制格式(Ultra Edit)打开,逐byte查看文件里面存储的元素值。BMP文件包含位图文件头和位图信息头。
位图文件头一般占 14 bytes,结构定义如下:
typedef struct tagBITMAPFILEHEADER{UNIT bfType;DWORD bfSize;UINT bfReserved1;UINT bfReserved2;DWORD bfOffBits;}BITMAPFILEHEADER;
其中:
bfType 说明文件类型,在windows系统中为BM。
bfSize 说明文件大小。
bfReserved1 bfReserved2 保留,设置为0。
bfOffBits 说明实际图形数据的偏移量。
位图信息头一般占 40 bytes,结构定义如下:
typedef struct tagBITMAPINFOHEADER{DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMerer;LONG biYPelsPerMerer;DWORD biClrUsed;DWORD biClrImportant;}BITMAPINFOHEADER;
其中:
biSize 说明BITMAPINFOHEADER结构所需字节数,在windows系统中为28h
biWidth 说明图像宽度
biHeight 说明图像高度
biPlanes 为目标设备说明位面数,其值设为1
biBitCount 每个像素的位数,单色位图为1,256色为8,24bit为24。
biCompression 压缩说明,BI_RGB:无压缩,BI_RLE8:8位RLE压缩,BI_RLE4:4位RLE压缩
biSizeImage 说明图像大小,如无压缩,可设为0
biXPelsPerMeter 水平分辨率
biYPelsPerMeter 垂直分辨率
biClrUsed 位图使用的颜色数
biImportant 重要颜色数目
下面,以获取的一张图片实例来解释 BMP头文件各个 byte所表示的含义:
用红色框出部分的数据为BMP头文件:
1.位图文件头
0,1:42 4D 为位图的标志。如果转换成 ASCII 码的话就是 BM。
2-5:(00 0E 10 36)H = 921654D(bytes),表示文件大小为921654bytes,也可以通过查看文件大小信息知道。
6-9:(00 00 00 00)H为保留字。
10-13:(00 00 00 36)H = 54D,文件起始位置标志,表示文件从第54位开始。
2.位图信息头
14-17:(00 00 00 28)H = 40D,表示位图信息头的长度,即为40 bytes。
18-21:(00 00 02 80)H = 640D,表示位图宽度,即为640 pixels。
22-25:(00 00 01 E0)H = 480D,表示位图高度,即为480 pixels。存储方式为从最后一行先存,最后存第一行//高度值为负数,则表示存储顺序为从上到下
26-27:(00 01)H,表示设备级别
28-29:(00 18)H = 24D,表示位图色彩级别,即为 24位真彩色。
30-33:(00 00 00 00)H,表示压缩类型,0表示不压缩
34-37:(00 0E 10 00)H = 921600D,位图阵列表字节数,即为921600 bytes。
38-41:(00 00 0B 6D)H,表示水平分辨率
42-45:(00 00 0B 6D)H,表示垂直分辨率
46-49:(00 00 00 00)H,表示位图实际使用的颜色表中的颜色变址。
50-53:(00 00 00 00)H,表示位图显示过程中被认为重要颜色变址数。
3.像素存储组织方式
BMP存储像素值的方式为从下至上,从左至右,紧随着文件头存储的字节为图像最下一行的数值,从左下角开始依次存储。
0C 27 20 36 ... 为图像左下角像素的数值,依次向右存储,最后一行扫描完后,紧接着存储上一行,最后一个byte存储的是图像右上角像素的数值。
可用MATLAB读取BMP图片后对比内存存放方式,就一目了然了。
以上,BMP存储方式讲清楚了。
至于64位的bmp图组织方式,下次补充!
BMP位图格式的内存存储方式相关推荐
- bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
目录 一.概述 二..bmp格式文件详解 2.1 位图文件头 2.2 位图信息头 2.3 调色板 2.4 位图数据 三.位图的其他知识 3.1 压缩的位图 一.概述 bmp是英文Bitmap ...
- alin的学习之路:C语言篇(一)(内存四区模型,宏函数,调用惯例,内存存储方式)
@TOC(内存四区模型,宏函数,调用惯例,内存存储方式) 1. 内存四区及其使用注意 内存四区:代码区,全局静态区,栈区,堆区 代码区 代码区存放的是CPU执行的二进制指令 特点: 只读 共享 栈区 ...
- BMP位图格式详解二--转载
转自:http://www.cnblogs.com/xiehy/archive/2011/06/07/2074405.html BMP文件格式,又称为Bitmap(位图)或是DIB(Device-In ...
- BMP位图格式详解--转载
位图格式 BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图.它一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区组成.在系统 ...
- BMP位图格式详解二
BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像 ...
- BMP位图格式详解一
位图格式 BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图.它一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区组成.在系统 ...
- Java二进制文件读写与bmp位图格式学习
最近在做实训,说是要用java读取位图进行图像处理,遂进行学习. bmp位图参考资料: 文档1 文档2 位图制作 首先使用AdobePhotoshop来制作一个3*2的位图test.bmp java提 ...
- Float浮点内存存储方式 转
1.0f 在内存中的存储为 0 011 1111 1 000 0000 0000 0000 0000 0000. 把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23 ...
- 浅析BMP位图文件结构(含Demo)[转]
<!--done--> 关于BMP位图格式在网上可以找到比较详细的相关文档,有兴趣的可以搜索标题为"BMP文件结构的探索"的文章,可以在搜索结果中找到一个WORD文 ...
最新文章
- QListWidget 小练习
- Pyserial 实现串口 base on python3
- redis的hash操作在集中式session中的应用
- 《系统集成项目管理工程师》必背100个知识点-84积极影响的风险的应对策略
- C++类的使用(三)—— 封装
- leetcode 198. 打家劫舍 思考分析
- hihocoder offer收割编程练习赛8 B 拆字游戏
- 李宏毅2017机器学习homework1-利用gradient descent拟合宝可梦CP值代码并利用adagrad进行优化
- IDL | 语句练习
- 微信小程序保存图片到相册
- 【GPU精粹与Shader编程】(三) 《GPU Gems 1》全书核心内容提炼总结 · 下篇
- 人工智能识别手写数学公式
- [HNOI2004]宠物收养所(简单理解,用set写的)
- 美团一点都不美,我再也不想给美团打工了
- tf.Keras.Model类总结
- appstore开发者中文名称修改
- android DISALLOW_EVIL_CONSTRUCTORS
- 51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS
- 小米华为智能手机未来路不平坦
- 皮肤结构走向运用仿制图章
热门文章
- 9. 使用SMTP发送邮件
- 宽带,梦想走向现实? (转)
- sql语句中大于号、小于号、大于等于、小于等于号的写法
- 基于React和Node.JS的表单录入系统的设计与实现
- 单链表实例(1)实现水浒传排行增删改查和练习
- 死锁的产生和解决方法
- 红队渗透靶场之prime1.0(超详细!)
- ubuntu系统安全和防护-区分固态硬盘和机械硬盘
- pip安装wordcloud安装方法
- Using the “escape“ directive (legacy escaping) is not allowed when auto-escaping is on with a markup