代码之家  ›  专栏  ›  技术社区  ›  Squid

无损RGB24到YUV444转换

  •  2
  • Squid  · 技术社区  · 11 年前

    我目前正在尝试在FFMPEG上使用H264对RGB24文件进行无损压缩。然而,H264压缩(RGB24->YUV444)中使用的颜色空间变换已被证明是有损的(我猜测是由于量化误差)。 在使用无损H264压缩RGB24文件之前,我还有什么可以使用的(例如程序)将RGB24转换为YUV文件吗?

    最终目标是压缩RGB24文件,然后解压缩,解压缩后的文件与原始文件完全匹配。例如RGB24->YUV444->压缩YUV44->解压缩的YUV444->RGB24。

    这有可能吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Community CDub    7 年前

    这是我的答案的复制/粘贴: RGB-frame encoding - FFmpeg/libav

    让我们看看色彩空间转换。

    void YUVfromRGB(double& Y, double& U, double& V, const double R, const double G, const double B)
    {
        Y =  0.257 * R + 0.504 * G + 0.098 * B +  16;
        U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
        V =  0.439 * R - 0.368 * G - 0.071 * B + 128;
    }
    

    插入一些虚拟值:

    R = 255, G = 255, B = 255
    Y = 235
    
    R = 0, G = 0, B = 0
    Y = 16
    

    如您所见,范围0->255被压扁为16->235.因此,我们已经表明在RGB颜色空间中存在一些不存在于(数字)YUV颜色空间中的颜色。因此,根据定义,转换是有损的。