private (double redGain, double greenGain, double blueGain) YCbCr(Surface src) { var maxY = 0.0; var redAccumulator = 0.0; var greenAccumulator = 0.0; var blueAccumulator = 0.0; for (var x = 0; x < src.Width; x++) { for (var y = 0; y < src.Height; y++) { var rgbColor = src[x, y]; var ycbcrColor = YCbCrColor.FromRgb(rgbColor); maxY = Math.Max(maxY, ycbcrColor.Y); redAccumulator += rgbColor.R; greenAccumulator += rgbColor.G; blueAccumulator += rgbColor.B; } } var pixelCount = src.Width * src.Height; var redAverage = redAccumulator / pixelCount; var greenAverage = greenAccumulator / pixelCount; var blueAverage = blueAccumulator / pixelCount; return(maxY / redAverage, maxY / greenAverage, maxY / blueAverage); }
private void Render(Surface dst, Surface src, Rectangle rect) { for (int x = rect.Left; x < rect.Right; x++) { for (int y = rect.Top; y < rect.Bottom; y++) { if (src.IsVisible(x, y)) { YCbCrColor color = YCbCrColor.FromRgb(src[x, y]); color.Cb = _selectedColor.Cb; color.Cr = _selectedColor.Cr; dst[x, y] = color.ToRgb(); } } } }
private static YCbCrColor[][] ToYCbCr(Surface source) { YCbCrColor[][] picture = new YCbCrColor[source.Width][]; for (int x = 0; x < picture.Length; x++) { picture[x] = new YCbCrColor[source.Height]; } for (int x = 0; x < picture.Length; x++) { for (int y = 0; y < picture[x].Length; y++) { picture[x][y] = YCbCrColor.FromRgb(source[x, y]); } } return(picture); }
/// <summary> /// Sets global effect parameters. /// </summary> /// <param name="parameters">The parameters.</param> /// <param name="dstArgs">The destination picture arguments.</param> /// <param name="srcArgs">The source picture arguments.</param> protected override void OnSetRenderInfo(PropertyBasedEffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs) { int color = parameters.GetProperty <Int32Property>("Color").Value; _selectedColor = YCbCrColor.FromRgb(ColorBgra.FromUInt32((UInt32)color)); }