示例#1
0
        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++;
            }
        }
示例#2
0
        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();
        }
示例#3
0
        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();
        }