说明:下面的代码用C\C++执行都可以,用C的时候请把#include 删除。 RGB to YUV420 原代码: RGB2YUV.CPP文件
#include
#include
#include
#include
//转换矩阵
#define MY(a,b,c) (( a* 0.2989 + b* 0.5866 + c* 0.1145))
#define MU(a,b,c) (( a*(-0.1688) + b*(-0.3312) + c* 0.5000 + 128))
#define MV(a,b,c) (( a* 0.5000 + b*(-0.4184) + c*(-0.0816) + 128))
//大小判断
#define DY(a,b,c) (MY(a,b,c) > 255 ? 255 : (MY(a,b,c) < 0 ? 0 : MY(a,b,c)))
#define DU(a,b,c) (MU(a,b,c) > 255 ? 255 : (MU(a,b,c) < 0 ? 0 : MU(a,b,c)))
#define DV(a,b,c) (MV(a,b,c) > 255 ? 255 : (MV(a,b,c) < 0 ? 0 : MV(a,b,c)))
//只处理352*288文件
#define WIDTH 352
#define HEIGHT 288
//读BMP
void ReadBmp(unsigned char *RGB,FILE *fp);
//转换函数
void Convert(unsigned char *RGB, unsigned char *YUV);
//入口
int main()
{
int i="1";
char file[255];
FILE *fp;
FILE *fp2;
unsigned char *YUV = NULL;
unsigned char *RGB = NULL;
unsigned int imgSize = WIDTH*HEIGHT;
if((fp2 = fopen("test.cif", "wb")) == NULL)//生成文件名
{
return 0;
}
RGB = (unsigned char*)malloc(imgSize*6);
YUV = (unsigned char*)malloc(imgSize + (imgSize>>1));
for(i=1; i<2; i++)
{
sprintf(file, "test.bmp", i);//读取文件
if((fp = fopen(file, "rb")) == NULL)
continue;
printf("打开文件%s\n", file);
ReadBm