实验二 BMP2YUV文件转换

一、实验原理

研究各种图像文件格式之间的转换,主要可以从两方面入手:1.从其中一种文件格式出发,考虑图像数据在该种文件格式下的内部存储方式。如:图像数据采用的色彩空间是什么?它存储在文件数据流的哪个部分?该格式除了实际的图像数据,是否还有其它信息数据?它们又存储在哪里?2.寻找两种文件格式之间的关系,以及它们之间的转换方法。关系如文件格式之间组织结构的异同,转换方法取决于色彩空间之间的转换公式。
从上述两方面来分析比较本次实验待转换的两种文件格式——bmp、yuv。

  1. bmp

    bmp(全称Bitmap)是Windows操作系统中的标准图像文件格式。BMP文件的图像深度可选1bit、4bit、8bit、16bit及24bit。典型的BMP图像文件由四部分组成:
    (1)位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
    (2)位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;在转换成yuv时,bmp图像的宽、高需为4的倍数。
    (3)调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
    (4)位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在 24 位图中直接使用RGB,而其他的小于 24 位的使用调色板中颜色索引值。bmp的实际图像数据是以自下而上、自左向右的扫描方式存放的。
    以一幅24bit的bmp(无调色板)为例,以二进制方式打开它,观察内部数据结构:
    24bit的bmp图像文件
    图中以不同颜色标示出了文件头和信息头部分,以及其中包含的几个重要的数据。注意计算机为小端系统,有先进后出的准则,在读取时要注意顺序。如图中图像的宽应读作(000002A8)B=680。
    以下给出bmp的文件头、信息头、调色板中应包含的所有数据(已包含在windows.h库里,实际操作时要记得包含该库):

typedef struct tagBITMAPFILEHEADER {
        WORD   bfType;     /* 说明文件的类型  */
        DWORD  bfSi;  /* 说明文件的大小,用字节为单位 */                                                    
        WORD   bfReserved1;   /* 保留,设置为0 */
        WORD   bfReserved2;   /* 保留,设置为0 */
        DWORD  bfOffBits; /* 说明从BITMAPFILEHEADER结    
                 构开始到实际的图像数据之间的字节偏移量 */
}   BITMAPFILEHEADER;   /* 文件头 */
typedef struct tagBITMAPINFOHEADER { 
        DWORD  biSize;    /* 说明结构体所需字节数 */
        LONG   biWidth; /* 以像素为单位说明图像的宽度 */
        LONG   biHeight; /*以像素为单位说明图像的高速 */
        WORD   biPlanes;   /* 说明位面数,必须为1 */
        WORD   biBitCount; /*说明位数,1、2、4、8、24*/
        DWORD  biCompression;  /* 说明图像是否压缩及
    压缩类型BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS */
        DWORD  biSizeImage;    /*  以字节为单位说明图像
                               大小 ,必须是4的整数倍*/
        LONG   biXPelsPerMeter;    /*  目标设备的水平分
                                    辨率,像素/米 */
        LONG   biYPelsPerMeter;    /*目标设备的垂直分辨
                                    率,像素/米 */
        DWORD  biClrUsed;  /* 说明图像实际用到的颜色数,
                 如果为0则颜色数为2的biBitCount次方 */
        DWORD  biClrImportant;  /*说明对图像显示有重要
             影响的颜色索引的数目,如果是0,表示都重要 */
}  BITMAPINFOHEADER;  /* 信息头 */
typedef struct tagRGBQUAD { 
       BYTE  rgbBlue;           /*指定蓝色分量*/
       BYTE  rgbGreen;        /*指定绿色分量*/
       BYTE  rgbRed;            /*指定红色分量*/
       BYTE  rgbReserved;   /*保留,指定为0*/
}  RGBQUAD;  /* 调色板 */
    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值