gpt4 book ai didi

c - RGB 到 YCbCr 转换代码

转载 作者:行者123 更新时间:2023-11-30 14:24:54 26 4
gpt4 key购买 nike

我想知道为什么这段代码不起作用。基本上它应该在 RGB 和 CbYCr 之间进行转换。当我从 RGB 转换为 CbYCr 然后再转换回 RGB 时,我没有得到原始的 RGB 值。这段代码有什么问题?

<p></p>

<p>#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))</p>

<p>struct _rgb {
<code>int R;</code>
<code>int G;</code>
<code>int B;</code>
};</p>

<p>typedef struct _rgb rgb;</p>

<p>struct _cbycr {
<code>int Cb;</code>
<code>int Y;</code>
<code>int Cr;</code>
};</p>

<p>typedef struct _cbycr cbycr;</p>

<p>void cbycr2rgb(rgb *c, double Y, double Cb, double Cr) {
<code>int r = (int)(Y + 1.40200 * (Cr - 0x80));</code>
<code>int g = (int)(Y - 0.34414 * (Cb - 0x80) - 0.71414 * (Cr - 0x80));</code>
<code>int b = (int)(Y + 1.77200 * (Cb - 0x80));</code>
<code>c->R = MAX(0, MIN(255, r));</code>
<code>c->G = MAX(0, MIN(255, g));</code>
<code>c->B = MAX(0, MIN(255, b));</code>
}</p>

<p>void rgb2cbycr(cbycr *c, int R, int G, int B) {
<code>c->Y = (int)(0.299 * R + 0.587 * G + 0.114 * B);</code>
<code>c->Cb = (int)(-0.16874 * R - 0.33126 * G + 0.50000 * B);</code>
<code>c->Cr =(int)(0.50000 * R - 0.41869 * G - 0.08131 * B);</code>
}</p>

<p>int main() {
<code>cbycr _cbycr;</code>
<code>rgb _rgb;</code>
<code>_rgb.R = 50;</code>
<code>_rgb.G = 50;</code>
<code>_rgb.B = 50;</code>
<code>rgb2cbycr(&_cbycr, _rgb.R, _rgb.G, _rgb.B);</code>
<code>cbycr2rgb(&_rgb, _cbycr.Y, _cbycr.Cb, _cbycr.Cr);</code>
<code>printf("rgb=%d %d %d\n", _rgb.R, _rgb.G, _rgb.B);</code>
<code>return 0;</code>
}
</p>

输出:rgb=0 185 0

最佳答案

JPEG 的 JFIF 使用允许 Y'CbCr,其中 Y'、Cb 和 Cr 具有 0-255 的完整 8 位范围。它通过向 Cb 和 Cr 值添加 0x80 偏差来实现此目的。 cbycr2rgb 函数(大概是正确的)尝试从 Cb 和 Cr 中减去该偏差值,但 rgb2cbycr 没有添加它,因此它无法返回原始 RGB 值.

关于c - RGB 到 YCbCr 转换代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com