0

我正在将 YUV422 帧转换为 PPM 文件 - (RGB888)。

图像主要是转换。颜色很好。但每一行似乎都是歪斜的,好像多余的

这是帧转换函数:

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 帧,它很好 - 我使用 SDL 显示它而没有这种失真。

有什么建议么?

TIA

4

1 回答 1

2

好的:解决了这个问题。

这很简单:yy2.

那里有很多解决方案,但似乎很少有完全正确的。

仅供参考:这确实有效,但仅适用于 yuv 4:2:2 格式。这似乎是最常见的带有 .fourcc 标签的YUYV。yuv 4:2:0 的转换要复杂得多。yuv 4:4:4 应该与此解决方案相同,只获取 1 个y组件,并且只写出一个 rgb 三元组。(无法验证,但我是这个解决方案的评论。

希望这可以帮助某人。

于 2014-04-02T01:31:36.540 回答