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;
}



posted @ 2016-07-19 11:16  chinayfhuang  阅读(1083)  评论(0)    收藏  举报