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图组织方式,下次补充!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值