YUV与RGB彩色空间转换公式
Y = 0.299R + 0.587G + 0.114B;
U = -0.169R - 0.331G + 0.5B ;
V = 0.5R - 0.419G - 0.081B;
R = Y + 1.4075V;
G = Y - 0.3455U - 0.7169V;
B = Y + 1.779U;
基本算法
该程序算法分为下面几个模块:
1、预备阶段:rgb文件导入项目、打开rgb文件,创建要进行输出的yuv文件和新的rgb文件、开辟空间。
2、提取rgb文件中的r、g、b分量
3、计算yuv分量并实现uv下采样,按照yuv文件格式输出进文件
4、利用yuv分量计算rgb分量,按照rgb文件格式输出文件
5、空间释放
main函数
#include"iostream"
#include"math.h"
#include"stdio.h"
#include"malloc.h"
#include"rgb2yuv.h"
#include"yuv2rgb.h"
using namespace std;
int main(int argc, char* argv[]){
char* imgaddr = argv[1];
char* yuvaddr = argv[2];
int W = atoi(argv[3]);
int H = atoi(argv[4]);
int imgsize = W*H*3;
unsigned char* imgbuffer = new unsigned char[imgsize];
unsigned char* Rbuffer = new unsigned char[imgsize/3];
unsigned char* Gbuffer = new unsigned char[imgsize/3];
unsigned char* Bbuffer = new unsigned char[imgsize/3];
FILE* imgopen = fopen(imgaddr,"rb");
if(imgopen == NULL){
cout<<"打开rgb文件失败"<<endl;
}
FILE* yuvsave = fopen(yuvaddr,"w");
if(yuvsave == NULL){
cout<<"创建yuv空白文件失败"<<endl;
}
transf(Rbuffer, Gbuffer, Bbuffer, imgbuffer, imgopen, yuvsave, W, H);
char* recoimgaddr = argv[5];
FILE* saverec = fopen(recoimgaddr,"w");
FILE* openyuv = fopen(yuvaddr,"rb");
if(saverec == NULL){
cout<<"创建恢复文件失败"<<endl;
}
int yuvFileSize;
FILE* checkyuv = fopen(yuvaddr,"rb");
fseek(checkyuv,