YUV与RGB格式互转
YUV与RGB格式都是表示色彩的,他们之间的转换如下:
// Hello4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
void yuv_to_rgb16(unsigned char y,
unsigned char u,
unsigned char v,
unsigned char *rgb)
{
register int r, g, b;
int rgb16;
r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u -128) ) >> 10;
b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;
r = r > 255 ? 255 : r < 0 ? 0 : r;
g = g > 255 ? 255 : g < 0 ? 0 : g;
b = b > 255 ? 255 : b < 0 ? 0 : b;
printf( "r =0x%x g =0x%x b =0x%x ",r,g,b);
rgb16 = (int)(((r >> 3)<<11) | ((g >> 2) << 5)| ((b >> 3) << 0));
*(rgb++) = (unsigned char)(rgb16 & 0xFF);
*(rgb++) = (unsigned char)((rgb16 & 0xFF00) >> 8);
}
void yuv_to_rgb32(unsigned char y,
unsigned char u,
unsigned char v,
unsigned char *rgb)
{
register int r, g, b;
r = (y + (359 * v)) >> 8;
g = (y - (88 * u) - (183 * v)) >> 8;
b = (y + (454 * u)) >> 8;
b = (b > 255) ? 255 : ((b < 0) ? 0 : b);
g = (g > 255) ? 255 : ((g < 0) ? 0 : g);
r = (r > 255) ? 255 : ((r < 0) ? 0 : r);
cout << "r = " << r << ", g = " << g << ", b = " << b << endl;
*(rgb++) = b;
*(rgb++) = g;
*(rgb++) = r;
*(rgb++) = 0x0;
}
void rbg_to_yuv(unsigned int R, unsigned int G, unsigned int B)
{
unsigned int Y, Cr, Cb;
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16;
Cr = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128;
Cb = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128;
cout << "Y = " << Y << ", Cr = " << Cr << ", Cb = " << Cb << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
char y = 0, u = 128, v = 128;
unsigned char rgbString[1024] = {0};
yuv_to_rgb16(y,u,v,rgbString);
//printf("\n");
//printf("rgbString[0] = %x,rgbString[1] = %x,rgbString[2] = %x",rgbString[0],rgbString[1],rgbString[2]);
//rbg_to_yuv(51,51,51);
system("pause");
return 0;
}
浙公网安备 33010602011771号