Exemplo n.º 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++;
            }
        }
Exemplo n.º 2
0
        protected void НарисоватьАкварельноеПятно(ПараметрыАкварельногоПятна параметры, Raster layerRaster, Raster targetRaster, Func <int, int, bool> advancedCondition = null)
        {
            var s = layerRaster.Width * layerRaster.Height;

            var nextPoints  = new List <Point>(s);
            var addedPoints = new List <Point>(nextPoints.Capacity);

            AddPoint(параметры.НачальнаяТочка, параметры.НачальныйЦвет, layerRaster, addedPoints, nextPoints);

            var count = 0;

            while (true)
            {
                if (count > 0 && count % (s / 16) == 0)
                {
                    InitNextPoints(layerRaster, nextPoints, СкоростьТаяния);
                }
                count++;

                if (addedPoints.Count >= s || nextPoints.Count == 0)
                {
                    break;
                }

                var basePoint = nextPoints[Rand.Next(nextPoints.Count)];
                var newPoint  = new Point(basePoint.X + Rand.Next(3) - 1, basePoint.Y + Rand.Next(3) - 1);

                if (newPoint.X < 0 || newPoint.Y < 0 || newPoint.X >= layerRaster.Width || newPoint.Y >= layerRaster.Height)
                {
                    continue;
                }
                if (layerRaster.GetAlpha(newPoint.X, newPoint.Y) > 0)
                {
                    continue;
                }
                if (advancedCondition != null && !advancedCondition(newPoint.X, newPoint.Y))
                {
                    continue;
                }

                var color = layerRaster.GetPixel(basePoint);
                if (color.A < СкоростьТаяния)
                {
                    continue;
                }
                var alpha = GetNewAlpha(color.A);
                if (alpha <= 0)
                {
                    continue;
                }

                AddPoint(newPoint, Color.FromArgb(alpha, color), layerRaster, addedPoints, nextPoints);
            }

            СкопироватьПятноНаОсновнойХолст(layerRaster, targetRaster, addedPoints);
        }
Exemplo n.º 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();
        }