private void Draw(IEnumerable <ColorPoint> points, Raster targetRaster, Raster layerRaster) { var count = 0; foreach (var colorPoint in points) { layerRaster.Clear(); var параметры = new ПараметрыАкварельногоПятна { НачальнаяТочка = colorPoint.Point, НачальныйЦвет = colorPoint.Color }; НарисоватьАкварельноеПятно(параметры, layerRaster, targetRaster); targetRaster.CopyDataToBitmap(); OnPreview(); var args = new ProgressEventArgs(count, points.Count()); OnProgress(args); if (args.Stop) { return; } count++; } }
public void Work(Raster raster) { var colorPoints = new List <Point>(raster.Width * raster.Height); InitColorPoints(raster, colorPoints); var emptyPointsCount = colorPoints.Capacity - colorPoints.Count; var progressStep = emptyPointsCount / КоличествоИтераций; var count = 0; while (count < emptyPointsCount - 1) { var index = Rand.Next(colorPoints.Count); var colorPoint = colorPoints[index]; var nearPoint = new Point(colorPoint.X + Rand.Next(3) - 1, colorPoint.Y + Rand.Next(3) - 1); if (nearPoint.X < 0 || nearPoint.X >= raster.Width || nearPoint.Y < 0 || nearPoint.Y >= raster.Height) { continue; } if (raster.GetAlpha(nearPoint) > 0) { continue; } var color = GetAverageColor(nearPoint, raster); if (ChangeColor && ИзменениеЦвета > 0) { color = GetNextColor(color, ИзменениеЦвета); } if (Таяние > 0) { if (Rand.Next(ПорогТаяния) == 0) { var a = color.A - Rand.Next(1 + Таяние); if (a < 1) { a = 1; } color = Color.FromArgb(a, color); } } raster.SetPixel(nearPoint, color); colorPoints.Add(nearPoint); if (count > 0 && count % (progressStep + 1) == 0) { raster.CopyDataToBitmap(); OnPreview(); var args = new ProgressEventArgs(count / (progressStep + 1), КоличествоИтераций); OnProgress(args); if (args.Stop) { return; } InitColorPoints(raster, colorPoints); } count++; } raster.CopyDataToBitmap(); OnPreview(); }
public override void Work(Bitmap bitmap) { using (var gr = CreateGraphics(bitmap)) gr.Clear(Color.White); using (var colorImage = LoadImage(ColorImagePath)) using (var linesImage = LoadImage(LinesImagePath)) { var w = colorImage.Width; var h = colorImage.Height; if (ИспользоватьГраницы) { if (w != linesImage.Width || h != linesImage.Height) { throw new InvalidOperationException("Размеры исходников не совпадают"); } } if (bitmap.Width != w || bitmap.Height != h) { throw new InvalidOperationException(string.Format("Размер изображения должен быть {0} x {1} пикселов", w, h)); } using (var sourceColorRaster = new Raster(colorImage)) using (var layer = new Bitmap(w, h, PixelFormat.Format32bppArgb)) using (var layerRaster = new Raster(layer, false, false)) using (var targetRaster = new Raster(bitmap)) using (var контуры = new Raster(linesImage)) for (var i = 0; i < КоличествоПятен; i++) { var x = Rand.Next(w); var y = Rand.Next(h); if (ИспользоватьГраницы) { if (контуры.GetAlpha(x, y) > НепрозрачностьГраниц) { continue; } } layerRaster.Clear(); var начальныйЦвет = ВзятЦветХолста(sourceColorRaster, x, y, 3); var параметры = new ПараметрыАкварельногоПятна { НачальнаяТочка = new Point(x, y), НачальныйЦвет = Color.FromArgb(Rand.Next(МаксНепрозрачность), начальныйЦвет), }; НарисоватьАкварельноеПятно(параметры, layerRaster, targetRaster, (xx, yy) => { if (!ИспользоватьГраницы) { return(true); } return(контуры.GetAlpha(xx, yy) < НепрозрачностьГраниц); }); targetRaster.CopyDataToBitmap(); OnPreview(); var args = new ProgressEventArgs(i, КоличествоПятен); OnProgress(args); if (args.Stop) { break; } } if (ИспользоватьГраницы && ДорисоватьЛинии) { using (var gr = CreateGraphics(bitmap)) gr.DrawImageUnscaled(linesImage, 0, 0); } } OnPreview(); }