bmp、DIB文件格式_学与玩_百度空间

             如何处理视频信号?视频信号种类很多,RGB,YUV,CVBS,S-VIDEO等等,学电子的,搞视频图像处理的,可能最终会用到上位机处理。我就是这样,呵呵,前段时间做了YUV数据的图像处理,用68013从CMOS sensor采集而来,上位机用GDI做的,费了不少劲,要了解YUV,就要了解RGB,要了解RGB,就要了解bmp图片,内存存放顺序,等等。

          bmp图片可以说是最简单的格式了,后缀一般是.bmp或.DIB,关于DIB格式,随便百度下,或找本VC介绍GDI的书看看就明白了,下面以一个例子来说明,估计这样好理解点,印象也深刻。

      1 .首先,用Windows自带的画图程序创建一个红绿两色的图片,尺寸大小640×480像素,如下图:

    

          OK,现在我们用UltraEdit打开这幅bmp图片,看到的是这样的16进制数:

     

     2 .我们观察:从地址36H开始到{zh1}有多少个字节,{zh1}是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开始,一直到{zh1},就是这幅图的图像数据信息

     3.然后我们看上面的红绿图片,按照上面说的,{dy}个像素应该是红色,RGB值应该是(255,0,0)。

好,那么我们来看下面的16进制图,从36H开始,36H,37H,38H这3个连续的字节表示{dy}个像素,依次是: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。

                                                好了,写到这里,下次写下各种视频数据格式吧,也就从网上东抄西摘了。

                                                                                            【谷】



郑重声明:资讯 【bmp、DIB文件格式_学与玩_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——