C语言 将 YCbCr 转换为 RGB 的函数?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4041840/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Function to convert YCbCr to RGB?
提问by SunnyShah
I have Y,Cb,Cr values each of 8 bit, can you give me simple C function which converts it to R,G,B each of 8 bit.
我有每个 8 位的 Y、Cb、Cr 值,你能给我简单的 C 函数将它转换为每个 8 位的 R、G、B。
Here is a prototype of it.
这是它的原型。
void convertYCbCrToRGB(
unsigned char Y,
unsigned char cg,
unsigned char cb,
unsigned char &r,
unsigned char &g,
unsigned char &b);
P.S
I am looking for correct conversion formula only. Because I am finding it different everywhere. Even I am also expert in C,C++
PS
我只在寻找正确的转换公式。因为我发现它无处不在。甚至我也是 C,C++ 专家
回答by SunnyShah
Here is my solution to my question.
This one is Full Range YCbCr to RGB conversion routine.
这是我对我的问题的解决方案。
这是全范围 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);
}
回答by jdehaan
The problem comes that nearly everybody confuses YCbCr YUV and YPbPr. So literature you can find is often crappy. First you have to know if you really have YCbCr or if someone lies to you :-).
问题来了,几乎每个人都会混淆 YCbCr YUV 和 YPbPr。所以你能找到的文学作品往往是蹩脚的。首先,您必须知道您是否真的拥有 YCbCr 或者是否有人对您撒谎 :-)。
- YUV coded data comes from analog sources (PAL video decoder, S-Video, ...)
- YPbPrcoded data also comes from analog sources but produces better color results as YUV (Component Video)
- YCbCr coded data comes from digital sources (DVB, HDMI, ...)
- YUV 编码数据来自模拟源(PAL 视频解码器、S-Video 等)
- YPbPr编码数据也来自模拟源,但产生更好的色彩效果,如 YUV(分量视频)
- YCbCr 编码数据来自数字源(DVB、HDMI...)
YPbPr and YCbCr are related. Here are the right formulae:
YPbPr 和 YCbCr 是相关的。以下是正确的公式:
https://web.archive.org/web/20180421030430/http://www.equasys.de/colorconversion.html
https://web.archive.org/web/20180421030430/http://www.equasys.de/colorconversion.html
(the archive.org has been added to fix the old, broken link).
(已添加 archive.org 以修复旧的、断开的链接)。
回答by hkyi
Integer operation of ITU-R standard for YCbCr is (from Wikipedia)
YCbCr ITU-R 标准的整数运算是(来自维基百科)
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) ;
or equivalently but more concisely to :
或等效但更简洁地:
Cr = Cr - 128 ;
Cb = Cb - 128 ;
r = Y + 45 * Cr / 32 ;
g = Y - (11 * Cb + 23 * Cr) / 32 ;
b = Y + 113 * Cb / 64 ;
do not forget to clamp values of r, g and b within [0,255].
不要忘记将 r、g 和 b 的值限制在 [0,255] 内。
回答by Adrian Regan
Check out this page. It contains useful information on conversion formulae.
看看这个页面。它包含有关转换公式的有用信息。
As an aside, you could return a unsigned int with the values for RGBA encoded from the most significant byte to least significant byte, i.e.
顺便说一句,您可以返回一个 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;
}

