/// <summary> /// Convert from RGB to YCbCr color space (Rec 601-1 specification). /// </summary> /// /// <param name="rgb">Source color in <b>RGB</b> color space.</param> /// <param name="ycbcr">Destination color in <b>YCbCr</b> color space.</param> /// public static void RGB2YCbCr(RGB rgb, YCbCr ycbcr) { double r = (double)rgb.Red / 255; double g = (double)rgb.Green / 255; double b = (double)rgb.Blue / 255; ycbcr.Y = 0.2989 * r + 0.5866 * g + 0.1145 * b; ycbcr.Cb = -0.1687 * r - 0.3313 * g + 0.5000 * b; ycbcr.Cr = 0.5000 * r - 0.4184 * g - 0.0816 * b; }
/// <summary> /// Convert from YCbCr to RGB color space. /// </summary> /// /// <param name="ycbcr">Source color in <b>YCbCr</b> color space.</param> /// <param name="rgb">Destination color in <b>RGB</b> color spacs.</param> /// public static void YCbCr2RGB(YCbCr ycbcr, RGB rgb) { // don't warry about zeros. compiler will remove them double r = Math.Max(0.0, Math.Min(1.0, ycbcr.Y + 0.0000 * ycbcr.Cb + 1.4022 * ycbcr.Cr)); double g = Math.Max(0.0, Math.Min(1.0, ycbcr.Y - 0.3456 * ycbcr.Cb - 0.7145 * ycbcr.Cr)); double b = Math.Max(0.0, Math.Min(1.0, ycbcr.Y + 1.7710 * ycbcr.Cb + 0.0000 * ycbcr.Cr)); rgb.Red = (byte)(r * 255); rgb.Green = (byte)(g * 255); rgb.Blue = (byte)(b * 255); }