文章目录
1.实验名称
BMP 序列转 YUV 文件
2.实验软件
Visual Studio 2019、YUVviewerPlus
3.实验目的
1.理解图像文件的基本组成。
2.掌握结构体作为复杂数据对象的用法。进一步熟悉由问题到程序的解决方案,并掌握编程细节:如内存分配、倒序读写、字节序、文件读写过程等。
4.实验任务
将以下五个BMP文件转化为一个YUV文件,要求可在命令行中设置每个画面出现的帧数,最后形成的YUV文件应至少包含200帧。
5.实验原理(思路)
BMP 图像文件由四部分组成:
(1)位图头文件数据结构,它包含 BMP 图像文件的类型、显示内容等信息;
(2)位图信息数据结构,它包含有 BMP 图像的宽、高、压缩方法,以及定义颜色等信
息;
(3)调色板,本次实验使用的是真彩色图(24位的 BMP)就不需要调色板;
(4)位图数据。
在C++的“windows.h"里已经包含以下两部分说明BMP头文件的结构体,其中需要使用的有图像的宽度——biWidth,图像的高度——biHeight,从 BITMAPFILEHEADER 结构开始到实际的图像数据之间的字节偏移量——bfOffBits.
根据bfOffBits,从BMP文件的实际图像部分开始读取B,G,R分量,然后利用上次封装好的RGB2YUV函数将RGB数据转化为为ybuffer,ubuffer,vbuffer,但是在实验结果中发现此时的yuv图像是倒置的,所以再编写函数将yuv图像旋转180°,最后在写入时,提前将每张转化后的BMP文件将要显示的帧数在命令行中设置好:
利用循环写入yuvFile。
6.实验代码(RGB转YUV函数上次已经使用过,此处不再贴出)
6.1头文件及声明部分
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<windows.h>
static float RGBYUV02990[256], RGBYUV05870[256], RGBYUV01140[256];
static float RGBYUV01684[256], RGBYUV03316[256];
static float RGBYUV04187[256], RGBYUV00813[256];
void InitLookupTable();
int RGB2YUV(int x_dim, int y_dim, void* bmp, void* y_out, void* u_out, void* v_out, int flip);
int YUV_convert(