YCbCr To RGB
This algorithm converts YCbCr color space to RGB color model.
public struct RGB
{
private byte _r;
private byte _g;
private byte _b;
public RGB(byte r, byte g, byte b)
{
this._r = r;
this._g = g;
this._b = b;
}
public byte R
{
get { return this._r; }
set { this._r = value; }
}
public byte G
{
get { return this._g; }
set { this._g = value; }
}
public byte B
{
get { return this._b; }
set { this._b = value; }
}
public bool Equals(RGB rgb)
{
return (this.R == rgb.R) && (this.G == rgb.G) && (this.B == rgb.B);
}
}
public struct YCbCr
{
private float _y;
private float _cb;
private float _cr;
public YCbCr(float y, float cb, float cr)
{
this._y = y;
this._cb = cb;
this._cr = cr;
}
public float Y
{
get { return this._y; }
set { this._y = value; }
}
public float Cb
{
get { return this._cb; }
set { this._cb = value; }
}
public float Cr
{
get { return this._cr; }
set { this._cr = value; }
}
public bool Equals(YCbCr ycbcr)
{
return (this.Y == ycbcr.Y) && (this.Cb == ycbcr.Cb) && (this.Cr == ycbcr.Cr);
}
}
public static RGB YCbCrToRGB(YCbCr ycbcr)
{
float r = Math.Max(0.0f, Math.Min(1.0f, (float)(ycbcr.Y + 0.0000 * ycbcr.Cb + 1.4022 * ycbcr.Cr)));
float g = Math.Max(0.0f, Math.Min(1.0f, (float)(ycbcr.Y - 0.3456 * ycbcr.Cb - 0.7145 * ycbcr.Cr)));
float b = Math.Max(0.0f, Math.Min(1.0f, (float)(ycbcr.Y + 1.7710 * ycbcr.Cb + 0.0000 * ycbcr.Cr)));
return new RGB((byte)(r * 255), (byte)(g * 255), (byte)(b * 255));
}
Example
YCbCr data = new YCbCr(0.28f, 0.21f, 0.34f);
RGB value = YCbCrToRGB(data);
Output
R: 192
G: 0
B: 166