最近在工程中遇见需要在framebuffer读取bmp图片的信息然后将图片传输到akvcam的虚拟播放器上显示。关于framebuffer的基础知识就不说了,我也只知道一些。主要想写的是在读取bmp图片时遇见的问题。读取bmp图片,我们需要知道bmp的基本格式。bmp主要由四部分组成:
-
位图文件头(bitmap-file header)
-
位图信息头(bitmap-informationheader)
-
颜色表(color table)
-
颜色点阵数据(bits data)
我所用的是24位的真彩图,就没有第三部分颜色表。1.位图头文件组成:
00H-01H (2bytes) :表示文件类型 BMP格式的文件这两个字节是0x4D42,10进制就是19778,字符显示就是‘BM’;
02H-05H (4bytes) :用字节表示整个文件的大小。
06H-09H (4bytes) :保留位,必须设置为0;
0AH-ODH (4bytes) :从文件开始到位图数据开始之间的数据量,称为偏移量:偏移量大小=位图文件头大小+位图信息头大小+调色板大小。
2.位图信息头组成:
0EH-11H (4bytes) :位图信息头的长度。
12H-15H (4bytes) :位图的宽度(单位为像素)。
16H-19H (4bytes) :位图的高度(单位为像素)。
1AH-1BH (2bytes) :位图的位面数。(注:该值恒为1)。
1CH-1DH (2bytes) :每个像素的位数,从上图可以看出为24色位图。根据计算 0x0018对应十进制的值确实为24。
1EH-21H (4bytes) :压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
该图片对应的为0x00000000,则该位图不压缩。
22H-25H (4bytes) :用字节数表示的位图数据的大小。该数必须是4的倍数。当不压缩时,它的取值可以为0。
26H-29H (4bytes) :用象素/米表示的水平分辨率。
2AH-2DH (4bytes) :用象素/米表示的垂直分辨率。
2EH-31H (4bytes) :文件使用的颜色数。如果为0,则表示使用了全部可能的颜色。
32H-35H (4bytes) :指定重要的颜色数。
3.调色板:
大小为N4(bytes),其中N表示颜色的数目。24位图(真彩)是没有调色板的,我们来验证一下当调色板大小为0是否的偏移量是否为54bytes,0x00000036对应十进制为54,验证正确。如果每个像素的位数不是24而是8,则对应的颜色数N=2^8