最近在捣鼓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位图格式的内存存储方式相关推荐

  1. bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等

    目录 一.概述 二..bmp格式文件详解  2.1 位图文件头  2.2 位图信息头  2.3 调色板  2.4 位图数据 三.位图的其他知识  3.1 压缩的位图 一.概述 bmp是英文Bitmap ...

  2. alin的学习之路:C语言篇(一)(内存四区模型,宏函数,调用惯例,内存存储方式)

    @TOC(内存四区模型,宏函数,调用惯例,内存存储方式) 1. 内存四区及其使用注意 内存四区:代码区,全局静态区,栈区,堆区 代码区 代码区存放的是CPU执行的二进制指令 特点: 只读 共享 栈区 ...

  3. BMP位图格式详解二--转载

    转自:http://www.cnblogs.com/xiehy/archive/2011/06/07/2074405.html BMP文件格式,又称为Bitmap(位图)或是DIB(Device-In ...

  4. BMP位图格式详解--转载

    位图格式 BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图.它一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区组成.在系统 ...

  5. BMP位图格式详解二

    BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像 ...

  6. BMP位图格式详解一

    位图格式 BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图.它一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区组成.在系统 ...

  7. Java二进制文件读写与bmp位图格式学习

    最近在做实训,说是要用java读取位图进行图像处理,遂进行学习. bmp位图参考资料: 文档1 文档2 位图制作 首先使用AdobePhotoshop来制作一个3*2的位图test.bmp java提 ...

  8. 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 ...

  9. 浅析BMP位图文件结构(含Demo)[转]

    <!--done-->   关于BMP位图格式在网上可以找到比较详细的相关文档,有兴趣的可以搜索标题为"BMP文件结构的探索"的文章,可以在搜索结果中找到一个WORD文 ...

最新文章

  1. Docker系列 四.Docker部署SpringBoot
  2. 图灵——2015技术类新书TOP20
  3. 计算机视觉——自动识别车牌简介
  4. CR渲染器全景图如何渲染颜色通道_如何制作SSS材质
  5. CSS Sprites图片合并
  6. 以操作系统的角度述说线程与进程
  7. 学习笔记:二叉搜索树的验证
  8. [leetcode] 144.二叉树的前序遍历
  9. 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
  10. preview窗口 unity_Unity3D在Preview中打印日志的方法
  11. python使用python-barcode生成任意长度字符串的条形码(一维码)详细教程
  12. Smarty 入手学习教程
  13. java 递归_两篇文章带你了解java基础算法之递归和折半查找
  14. [转载] Python 内置函数 dir()
  15. RootKit检测工具
  16. 黑马程序员软件测试面试宝典
  17. php 等额本息+等额本金生成公式
  18. java中的传参是什么意思_Java中参数传递是传值还是传址?
  19. 剑指 Offer 19. 正则表达式匹配 regex_match() regex()
  20. 浮点运算/半精度,单精度,双精度/浮点和定点

热门文章

  1. 3jjjjjjkkjj
  2. CrashRpt.dll用来在应用程序出现异常crash
  3. 从入职到离职员工需要注意的九个安全细节
  4. chatgpt的语音机器人
  5. php app 第三方登录接口开发文档,申请appid和appkey
  6. 《Centos下部署ThinkPHP》
  7. mobiscroll的具体用法
  8. KSO - The source IQueryable doesn‘t implement IDbAsyncEnumerable<Admin.NET.Core.WareLocationVsContai
  9. Cy3/5/7标记多肽/PEG/聚合物/磷脂----为华生物
  10. 手机word文档怎么转换成pdf?分享两种方法