2014-04-01 201 views
0

我轉換YUV422幀到PPM文件 - (RGB888)。YUV至RGB轉換的列不對齊

圖像轉換主要是。顏色很好。但每次似乎行歪斜,彷彿額外

這裏是幀轉換功能:

BYTE* CYUV::toRGB() 
{ 
    BYTE* rgb = new BYTE[m_width*m_height*3]; 
    BYTE* rgb_ret = rgb; 
    BYTE* p_yuv = m_yuv_frame; 

    for (int i=m_width*m_height/2; i--;) 
    { 
     BYTE y, u, v, y2; 
     BYTE r,g, b; 

     y2 = *p_yuv++; 
     v = *p_yuv++; 
     y = *p_yuv++; 
     u = *p_yuv++; 

     r = (y + 1.370705 * (v - 128)); 
     g = (y - (0.698001 * (v - 128)) - (0.337633 * (u - 128))); 
     b = (y + (1.732446 * (u - 128))); 
     *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b; 
     *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g; 
     *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r; 


     r = (y2 + 1.370705 * (v - 128)); 
     g = (y2 - (0.698001 * (v - 128)) - (0.337633 * (u - 128))); 
     b = (y2 + (1.732446 * (u - 128))); 
     *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b; 
     *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g; 
     *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r; 


    } 
    return rgb_ret; 
} 

我相信實際的YUV到RGB像素轉換是正確的,因爲我已經嘗試過許多其他的公式,顏色扭曲的結果。

對於PPM文件,那也不錯,因爲所有的圖像讀取處理。

至於原YUV4222幀,它是細 - I它使用SDL沒有這種失真顯示。

有什麼建議嗎?

TIA

回答

1

OK:解決了這個。

這是很簡單的:寫出來的y2之前y轉換的像素。

有這麼多的解決方案在那裏,但很少有人完全正確的。

FYI:這並不工作,但只是YUV 4:2:2格式。這似乎是最常見的四個標籤YUYV。 yuv 4:2:0轉換要複雜得多。 yuv 4:4:4應該和這個解決方案一樣,只提取1 y組件,只寫出一個rgb三元組。 (無法驗證,但我這是用此溶液沿着評論。

希望這可以幫助別人。