public T Convert(T source, params object[] prms) { if (prms.Length > 0) { throw new Exception("Не должно быть параметров"); } var dist = new MyImage(source.Width, source.Height); double Ra = 0, Ba = 0, Ga = 0; double Avg = 0; object srcimg = source; var tasks = new List <Task <double[]> >(); var ranges = DivRange.Divide(0, 0, source.Width, source.Height, 16); foreach (var range in ranges) { tasks.Add(Task <double[]> .Factory.StartNew(() => GetSumRgb((MyImage)srcimg, range[0], range[1], range[2], range[3]))); } foreach (var ts in tasks) { Ra += ts.Result[0]; Ba += ts.Result[1]; Ga += ts.Result[2]; } Ra = Ra / (source.Width * source.Height); Ba = Ba / (source.Width * source.Height); Ga = Ga / (source.Width * source.Height); Avg = (Ra + Ba + Ga) / 3; Parallel.For(0, source.Width, i => { Parallel.For(0, source.Height, j => { Color color = source[i, j]; Color newcolor = Color.FromArgb( Norm(color.R * Avg / Ra), Norm(color.G * Avg / Ga), Norm(color.B * Avg / Ba)); dist[i, j] = newcolor; }); }); object img = dist; return((T)img); }
public T Convert(T source, params object[] prms) { if (prms.Length != 0) { throw new Exception("Не должно быть параметров"); } var dist = new MyImage(source.Width, source.Height); object srcimg = source; var tasks = new List <Task>(); var ranges = DivRange.Divide(0, 0, source.Width, source.Height, 16); foreach (var range in ranges) { tasks.Add(Task.Run(() => ChangeToGrayscale((MyImage)srcimg, dist, range[0], range[1], range[2], range[3]))); } Task.WaitAll(tasks.ToArray()); object img = dist; return((T)img); }