bmp图片可以说是最简单的格式了,后缀一般是.bmp或.DIB,关于DIB格式,随便百度下,或找本VC介绍GDI的书看看就明白了,下面以一个例子来说明,估计这样好理解点,印象也深刻。
1 .首先,用Windows自带的画图程序创建一个红绿两色的图片,尺寸大小640×480像素,如下图:
OK,现在我们用UltraEdit打开这幅bmp图片,看到的是这样的16进制数:
2 .我们观察:从地址36H开始到最后有多少个字节,最后是E1035H,E1035-36+1(别说为什么要+1),
结果是E1000,十进制就是921600;
好,然后我们看以下,640×480×3等于多少呢?bingo!640×480×3=921600;
为什么呢?呵呵,下面解释(有人问为什么从36H开始的话,等等下面再说!!):
首先我们用画图程序建立的bmp文件是RGB24格式的,我们建立的640×480的图片,意思是这个图片含有640×480个像素(别说不知道什么是像素--!)RGB24格式(也就是RGB888)是指一个像素用RGB表示,有3个字节,R,G,B各占8位共24位,这就为什么叫RGB24或RGB888的原因了;
那么,现在清楚了吧,640×480个像素,一个像素(R/G/B三个分量)占3个字节,那刚好就是921600个字节;所以我们就知道了,从36H开始,一直到最后,就是这幅图的图像数据信息
3.然后我们看上面的红绿图片,按照上面说的,第一个像素应该是红色,RGB值应该是(255,0,0)。
好,那么我们来看下面的16进制图,从36H开始,36H,37H,38H这3个连续的字节表示第一个像素,依次是:00 00 FF,也就是RGB(0,0,255)-这是蓝色的RGB值!!为什么会这样呢?
这是因为一个像素的RGB值在内存中的排列不是RGB,而是BGR这样排列的,所有像素排列是BGRBGRBGRBGR.....,所以00 00 FF表示的RGB值应该是B-00,G-00,R-255,就是(255,0,0)红色的RGB值了,呵呵~
4. 下面说为什么从36H开始:
首先,我们知道,图片有很多种,bmp啊,jpg啊,gif啊等等,那么36H以后是图像信息,那么图像的格式在哪里保存呢?嘿嘿,就在前面的54个字节中(0-35H,10进制就是54),当然,这54个字节还有其他信息。
对照上面第二个16进制数的图:
0000H-0001H(2字节):42 4D——表示该文件是bmp文件
0002H-0005H(4字节):36 10 0E 00——整个bmp文件的大小(单位字节)。按照内存中数据存放地位在
前,高位在后的原则,这个数是 实际是000E1036,10进制是 921654=640×480
×3+54(字节)。
0006H-0009H(4字节):00 00 00 00——系统保留,必须设置为0
000AH-000DH(4字节):36 00 00 00——从bmp文件开始到位图数据开始之间的偏移量(字节)。也就是
图像数据前的54个字节,00000036,10进制是54.
000EH-0011H(4字节):28 00 00 00——位图信息头的的长度
0012H-0015H(4字节):80 02 00 00——位图宽度,单位像素。00000280,10进制是640.
0016H-0020H(4字节):E0 01 00 00——位图高度,单位像素。000001E0,10进制是480.
001CH-001DH(2字节):18 00——每个像素的位数。RGB24当然每个像素24位了,16进制的18.
001EH-0021H(4字节):00 00 00 00——0,表示不压缩(BI_RGB)。
0022H-0025H(4字节):00 10 0E 00——用字节数表示的位图数据大小。000E1000就是640×480
0026H-0029H(4字节):00 00 00 00——用像素/米表示的水平分辨率。
002AH-002DH(4字节):00 00 00 00——用像素/米表示的垂直分辨率。
002EH-0031H(4字节):00 00 00 00——位图使用的颜色数
0032H-0035H(4字节):00 00 00 00——指定重要的颜色数,为0表示所有颜色都重要。
以上的54字节意义可以很容易和VC中位图信息头结构体联系起来:
在VC中定义的位图信息头为:
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
可以和上面的一一对应,具体每个参数的意义,自行可查阅MSDN。
好了,写到这里,下次写下各种视频数据格式吧,也就从网上东抄西摘了。