将YCbCr转换为RGB的功能?

时间:2010-10-28 10:15:06

标签: c graphics rgb

我有8位的Y,Cb,Cr值,你能给我简单的C函数,它将它转换为8位的R,G,B。

这是它的原型。

void convertYCbCrToRGB(
    unsigned char Y,
    unsigned char cg,
    unsigned char cb,
    unsigned char &r,
    unsigned char &g,
    unsigned char &b);

P.S
我正在寻找正确的转换公式。因为我发现它到处都是不同的。即使我也是C,C ++的专家

4 个答案:

答案 0 :(得分:8)

问题在于几乎所有人都混淆了YCbCr YUV和YPbPr。所以你能找到的文献往往很糟糕。首先你必须知道你是否真的有YCbCr或者有人骗你: - )。

  • YUV编码数据来自模拟信号源(PAL视频解码器,S-Video,...)
  • YPbPr编码数据也来自模拟信号源,但产生的颜色效果更好,因为YUV(分量视频)
  • YCbCr编码数据来自数字源(DVB,HDMI,...)

YPbPr和YCbCr是相关的。以下是正确的公式:

https://web.archive.org/web/20180421030430/http://www.equasys.de/colorconversion.html

(已添加archive.org以修复旧的,损坏的链接)。

答案 1 :(得分:7)

这是我对我的问题的解决方案 这是一个全范围YCbCr到RGB转换例程。

Color GetColorFromYCbCr(int y, int cb, int cr, int a)
{
 double Y = (double) y;
 double Cb = (double) cb;
 double Cr = (double) cr;

 int r = (int) (Y + 1.40200 * (Cr - 0x80));
 int g = (int) (Y - 0.34414 * (Cb - 0x80) - 0.71414 * (Cr - 0x80));
 int b = (int) (Y + 1.77200 * (Cb - 0x80));

 r = Max(0, Min(255, r));
 g = Max(0, Min(255, g));
 b = Max(0, Min(255, b));

 return Color.FromArgb(a, r, g, b);
}

答案 2 :(得分:3)

查看此page。它包含有关转换公式的有用信息。

顺便说一下,你可以返回一个unsigned int,其中RGBA的值从最高有效字节到最低有效字节编码,即

unsigned int YCbCrToRGBA(unsigned char Y, unsigned char Cb, unsigned char Cb) {
   unsigned char R = // conversion;
   unsigned char G = // conversion;
   unsigned char B = // conversion;

   return (R << 3) + (G << 2) + (B << 1) + 255;
}

答案 3 :(得分:2)

YCbCr的ITU-R标准的整数运算是(from Wikipedia

Cr = Cr - 128 ;
Cb = Cb - 128 ;
r = Y + ( Cr >> 2 + Cr >> 3 + Cr >> 5 ) ;
g = Y - ( Cb >> 2 + Cb >> 4 + Cb >> 5) - ( Cr >> 1 + Cr >> 3 + Cr >> 4 + Cr >> 5) ;
b = Y + ( Cb + Cb >> 1 + Cb >> 2 + Cb >> 6) ;

或等效但更简洁:

Cr = Cr - 128 ;
Cb = Cb - 128 ;
r = Y + 45 * Cr / 32 ;
g = Y - (11 * Cb + 23 * Cr) / 32 ;
b = Y + 113 * Cb / 64 ;

不要忘记将r,g和b的值钳位在[0,255]内。