如何在C/C++中执行RGB到YUV的转换?

12

如何在C/C++中执行RGB->YUV转换?

我有一些位图.. RGB格式,需要将其转换为YUV格式

哪些库和教程或文章可以参考?


4
s/with actionscript/in C\/C++/翻译为中文是“将 ActionScript 中的代码替换为 C/C++ 并不意味着这是一个新问题。”http://stackoverflow.com/questions/1737712/how-to-perform-rgb-yuv-conversion-with-actionscript - Esteban Küber
1
你想把RGB值转换成YUV吗?或者把RGB位图转换成YUV文件?你想进行图像文件转换,对吧? - Esteban Küber
我相信有一种方法可以将这项工作推送到图形卡上。这种操作非常适合图形卡。 - fishfood
2个回答

35

您可能也想尝试这些仅针对整数的计算(比浮点数更快)

#define CLIP(X) ( (X) > 255 ? 255 : (X) < 0 ? 0 : X)

// RGB -> YUV
#define RGB2Y(R, G, B) CLIP(( (  66 * (R) + 129 * (G) +  25 * (B) + 128) >> 8) +  16)
#define RGB2U(R, G, B) CLIP(( ( -38 * (R) -  74 * (G) + 112 * (B) + 128) >> 8) + 128)
#define RGB2V(R, G, B) CLIP(( ( 112 * (R) -  94 * (G) -  18 * (B) + 128) >> 8) + 128)

// YUV -> RGB
#define C(Y) ( (Y) - 16  )
#define D(U) ( (U) - 128 )
#define E(V) ( (V) - 128 )

#define YUV2R(Y, U, V) CLIP(( 298 * C(Y)              + 409 * E(V) + 128) >> 8)
#define YUV2G(Y, U, V) CLIP(( 298 * C(Y) - 100 * D(U) - 208 * E(V) + 128) >> 8)
#define YUV2B(Y, U, V) CLIP(( 298 * C(Y) + 516 * D(U)              + 128) >> 8)

// RGB -> YCbCr
#define CRGB2Y(R, G, B) CLIP((19595 * R + 38470 * G + 7471 * B ) >> 16)
#define CRGB2Cb(R, G, B) CLIP((36962 * (B - CLIP((19595 * R + 38470 * G + 7471 * B ) >> 16) ) >> 16) + 128)
#define CRGB2Cr(R, G, B) CLIP((46727 * (R - CLIP((19595 * R + 38470 * G + 7471 * B ) >> 16) ) >> 16) + 128)

// YCbCr -> RGB
#define CYCbCr2R(Y, Cb, Cr) CLIP( Y + ( 91881 * Cr >> 16 ) - 179 )
#define CYCbCr2G(Y, Cb, Cr) CLIP( Y - (( 22544 * Cb + 46793 * Cr ) >> 16) + 135)
#define CYCbCr2B(Y, Cb, Cr) CLIP( Y + (116129 * Cb >> 16 ) - 226 )

1
与所谓的“ImageMagick”相比,这不是更好的答案吗? - kenmux
1
你的“YUV”不是真正的YUV,因为YUV只是模拟信号,PAL和NTSC电视中使用不同幅度的通道Y、U、V。YCbCr是YUV在归一化值范围内的数字表示,因此你的两个公式集都是YCbCr。唯一的区别是,你的“YUV”是带有所谓的“工作室摆动”(减小的值范围)的YCbCr,而你的“YCbCr”是带有所谓的“全摆动”(完整的值范围)的YCbCr。请参见https://en.wikipedia.org/wiki/YUV。 - Tobias Knauss

19

嗨Voyager,我需要一些帮助。我已经转储了我的代码,它是yv12->rgb565的。同样,我还需要将yuv444转换为rgb888。请指导我。请查看我的最新问题,其中包含将yuv12->rgb565转换的函数。 - Abhineet
2
请注意,有几个标准规定了您可能在yuv文件中遇到的色彩空间(即BT601、BT709、xvYcc),这些公式将为您提供可视化图像,并覆盖大多数情况,但是您可能需要更改它们以获取正确的颜色(如果您拥有xvYcc或非8位数据,则还可能必须裁剪或缩放输入或输出值)。 - tletnes
链接无法使用。 - Kartik Podugu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接