1. 程式人生 > >YUV格式學習:Y轉換成RGB24

YUV格式學習:Y轉換成RGB24

除了各種YUV格式轉換成RGB外,還有一種是隻轉Y到RGB,如果YUV只有Y分量,也就就是YUV400這個格式了。如果成RGB後,顯示出來的影象就是灰度圖(因為Y是亮度),也可以理解為黑白圖吧。下面給出轉換函式:

/**
只支援平面、半平面的格式
交織的不支援,因為不知道如何獲取Y
*/
void y_to_rgb24(unsigned char *yuv, unsigned char *rgb, int width, int height)
{
    int y, cb, cr;
    int r, g, b;
    int i = 0;
    unsigned char* p_y;
    unsigned char* p_rgb;

    p_y = yuv;

    p_rgb = rgb;

    // 只轉換Y的,U、V也需要,其值固定為128
    cb = 128;
    cr = 128;
    init_yuv422p_table();

    for (i = 0; i < width * height; i++)
    {
        y  = p_y[0];
        r = MAX (0, MIN (255, (V[cr] + Y1[y])/10000));   //R value
        b = MAX (0, MIN (255, (U[cb] + Y1[y])/10000));   //B value
        g = MAX (0, MIN (255, (Y2[y] - 5094*(r) - 1942*(b))/10000)); //G value
        p_rgb[0] = r;
        p_rgb[1] = g;
        p_rgb[2] = b;

        p_rgb += 3;
        p_y++;
    }
}

注意,這個函式只支援平面的格式,因為平面格式的Y是在最前面的,並佔用width*height大小。如果是YUYV這類的打包格式,影象顯示是錯亂的。

PS:至此,除了YUV411這個很少用的格式,其它我所接觸的格式轉換就完成了。可以為我準備寫的播放器做下強有力的技術支撐。

李遲 2015.8.7 中午