Пример #1
0
 public IEnumerable<MouseDragAction> GetDrawInstructions(List<ColorSpot> colorPalette, IDictionary<string, string> options = null, IBrushChanger brushChanger = null)
 {
     if (!colorPalette.Any())
     {
         throw new ArgumentException("I need some colors. Give me some colors. Thanks!");
     }
     var output = new List<MouseDragAction>();
     var colorPixels = colorPalette.ToDictionary(colorSpot => colorSpot, colorSpot => new List<Point>());
     using (var bitmap = new Bitmap(_bitmapPath))
     {
         bitmap.LoopThroughPixels((point, color) =>
             {
                 var selectedColor = colorPalette.OrderBy(c => c.Color.DifferenceTo(color)).FirstOrDefault();
                 if (selectedColor == null || !colorPixels.ContainsKey(selectedColor) ||
                     selectedColor.Color.DifferenceTo(Color.White) == 0)
                 {
                     return;
                 }
                 colorPixels[selectedColor].Add(point);
             });
     }
     foreach (var colorPixel in colorPixels.Where(colorPixel => colorPixel.Value.Any()))
     {
         output.Add(new MouseDragAction(new List<Point> { colorPixel.Key.Point }, true, colorPixel.Key.Color));
         var actions = colorPixel.Value.Select(point => new MouseDragAction(new List<Point> { point })).ToList();
         if (options.GetBoolValueOrDefault("MixPoints", false))
         {
             actions = actions.Shuffle().ToList();
         }
         output.AddRange(actions);
     }
     return output.ToArray();
 }
Пример #2
0
 public IEnumerable<MouseDragAction> GetDrawInstructions(List<ColorSpot> colorPalette, IDictionary<string, string> settings = null, IBrushChanger brushChanger = null)
 {
     if (colorPalette.All(c => c.Color.R + c.Color.G + c.Color.B != 0))
     {
         throw new ArgumentException("I need a black color in the palette!");
     }
     var selectedColor = colorPalette.First(c => c.Color.R + c.Color.G + c.Color.B == 0);
     if (settings == null)
     {
         settings = new Dictionary<string, string>();
     }
     var args = new PixelAcceptanceArgs
         {
             MaxLight = settings.GetIntValueOrDefault("MaxLight", 700),
             BlueEnabled = settings.GetBoolValueOrDefault("BlueEnabled", false),
             BlueMax = settings.GetIntValueOrDefault("BlueMax", 255),
             BlueMin = settings.GetIntValueOrDefault("BlueMin", 0),
             GreenEnabled = settings.GetBoolValueOrDefault("GreenEnabled", false),
             GreenMax = settings.GetIntValueOrDefault("GreenMax", 255),
             GreenMin = settings.GetIntValueOrDefault("GreenMin", 0),
             RedEnabled = settings.GetBoolValueOrDefault("RedEnabled", false),
             RedMin = settings.GetIntValueOrDefault("RedMin", 0),
             RedMax = settings.GetIntValueOrDefault("RedMax", 255)
         };
     if (String.IsNullOrEmpty(_bitmapPath))
     {
         return null;
     }
     var output = new List<MouseDragAction>
         {
             new MouseDragAction(new List<Point> { selectedColor.Point }, true, selectedColor.Color)
         };
     using (var bitmap = new Bitmap(_bitmapPath))
     {
         var currentAction = new List<Point>();
         bitmap.LoopThroughPixels((point, color) =>
         {
             if (!pixelFits(color.R, color.G, color.B, args))
             {
                 return;
             }
             if (currentAction.Any() && !currentAction.Last().IsANeighborOf(point))
             {
                 output.Add(new MouseDragAction(currentAction));
                 currentAction = new List<Point>();
             }
             currentAction.Add(point);
         });
     }
     return output.ToArray();
 }
Пример #3
0
        public IEnumerable<MouseDragAction> GetDrawInstructions(List<ColorSpot> color, IDictionary<string, string> settings = null, IBrushChanger brushChanger = null)
        {
            List<ColorSpot> knownColors = color.ToList();
            int ignoredColor;
            try
            {
                ignoredColor = knownColors.IndexOf(knownColors.First(x => x.IsBackgroundColor));
            }
            catch (Exception)
            {
                throw new Exception("I need a background color!!");
            }
            // prevent drawing of single pixels etc
            int colorGroupMinSize = settings.GetIntValueOrDefault("MinimumStrokeSize", 15);

            var output = new List<MouseDragAction>();

            using (var bitmap = new Bitmap(this._bitmapPath))
            {
                this._bitmapHeight = bitmap.Height;
                this._bitmapWidth = bitmap.Width;
                var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
                this._colors = new int[bitmap.Width,bitmap.Height];
                this._colorsProcessed = new bool[bitmap.Width,bitmap.Height];
                //_pixels = new KeyValuePair<Point, PixelMeta>[bitmap.Width * bitmap.Height];
                BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat);
                IntPtr ptr = bmpData.Scan0;
                int bytes = bmpData.Stride * bitmap.Height;
                var rgbValues = new byte[bytes];
                Marshal.Copy(ptr, rgbValues, 0, bytes);
                for (int x = 0; x < bitmap.Width; x++)
                {
                    for (int y = 0; y < bitmap.Height; y++)
                    {
                        int position = (y * bmpData.Stride) + (x * 3);
                        int blue = rgbValues[position];
                        int green = rgbValues[position + 1];
                        int red = rgbValues[position + 2];
                        Color currentColor = Color.FromArgb(red, green, blue);
                        ColorSpot closestColor = knownColors.OrderBy(c => c.Color.DifferenceTo(currentColor)).FirstOrDefault();
                        this._colors[x, y] = knownColors.IndexOf(closestColor);
                    }
                }
                bitmap.UnlockBits(bmpData);
            }

            var colorGroups = new List<List<Point>>();
            for (int x = 0; x < this._bitmapWidth; x++)
            {
                for (int y = 0; y < this._bitmapHeight; y++)
                {
                    if (this._colors[x, y] != ignoredColor && !this._colorsProcessed[x, y])
                    {
                        colorGroups.AddRange(this.GetNeighboringColors(x, y));
                    }
                }
            }

            int? lastColorIndex = null;
            IOrderedEnumerable<List<Point>> colorGroupsOrderedByColor =
                colorGroups.Where(x => x.Count >= colorGroupMinSize).OrderBy(x => this._colors[x.First().X, x.First().Y]);
            foreach (var colorGroup in colorGroupsOrderedByColor)
            {
                var colorOutput = new List<MouseDragAction>();
                int currentColorIndex = this._colors[colorGroup.First().X, colorGroup.First().Y];
                if (!lastColorIndex.HasValue || lastColorIndex.Value != currentColorIndex)
                {
                    lastColorIndex = currentColorIndex;
                    ColorSpot currentColor = knownColors[this._colors[colorGroup.First().X, colorGroup.First().Y]];
                    var colorChangeAction = new MouseDragAction(new List<Point> { currentColor.Point }, true, currentColor.Color);
                    colorOutput.Add(colorChangeAction);
                }
                var ma = new MouseDragAction(colorGroup.Select(x => new Point(x.X, x.Y)).ToList());
                colorOutput.Add(ma);
                output.AddRange(colorOutput);
            }

            return output;
        }
Пример #4
0
        public IEnumerable<MouseDragAction> GetDrawInstructions(List<ColorSpot> PaletteColorSpots, IDictionary<string, string> settings = null, IBrushChanger brushChanger = null)
        {
            int ignoreColorIndex =
                PaletteColorSpots.IndexOf(PaletteColorSpots.FirstOrDefault(x => x.Color.Name == IgnoreColor));

            if (!PaletteColorSpots.Any())
            {
                PaletteColorSpots = new List<ColorSpot> {new ColorSpot {Color = Color.Black, Point = Point.Empty}};
            }

            int bitmapHeight;
            int bitmapWidth;

            var output = new List<MouseDragAction>();

            using (var bitmap = new Bitmap(_bitmapPath))
            {
                bitmapHeight = bitmap.Height;
                bitmapWidth = bitmap.Width;

                _colors = new int[bitmapWidth,bitmapHeight];

                var rect = new Rectangle(0, 0, bitmapWidth, bitmapHeight);
                BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat);
                IntPtr ptr = bmpData.Scan0;
                int bytes = bmpData.Stride*bitmapHeight;
                var rgbValues = new byte[bytes];
                Marshal.Copy(ptr, rgbValues, 0, bytes);
                for (int x = 0; x < bitmapWidth; x++)
                {
                    for (int y = 0; y < bitmapHeight; y++)
                    {
                        int position = (y*bmpData.Stride) + (x*3);
                        int blue = rgbValues[position];
                        int green = rgbValues[position + 1];
                        int red = rgbValues[position + 2];
                        Color currentColor = Color.FromArgb(red, green, blue);
                        ColorSpot matchingColor =
                            PaletteColorSpots.OrderBy(c => c.Color.DifferenceTo(currentColor)).First();
                        _colors[x, y] = PaletteColorSpots.IndexOf(matchingColor);
                    }
                }
                bitmap.UnlockBits(bmpData);
            }

            int colorCount = PaletteColorSpots.Count;
            var strokesForEachColor = new List<MouseDragAction>[colorCount];

            for (int i = 0; i < colorCount; i++)
            {
                ColorSpot paletteColorSpot = PaletteColorSpots[i];
                strokesForEachColor[i] = new List<MouseDragAction>
                    {new MouseDragAction(new List<Point> {paletteColorSpot.Point}, true, paletteColorSpot.Color)};
            }

            for (int x = 0; x < bitmapWidth; x++)
            {
                for (int y = 0; y < bitmapHeight; y++)
                {
                    int currentPixelColorIndex = _colors[x, y];
                    if (currentPixelColorIndex == ignoreColorIndex)
                    {
                        continue;
                    }
                    var currentPixelPoint = new Point(x, y);
                    List<MouseDragAction> strokesForCurrentColor = strokesForEachColor[currentPixelColorIndex];
                    bool found = false;

                    foreach (MouseDragAction stroke in strokesForCurrentColor)
                    {
                        if (stroke.DiscardOffset)
                        {
                            continue;
                        }
                        Point lastPoint = stroke.Points[stroke.Points.Count - 1];
                        if (PointsAreNeighbors(lastPoint.X, lastPoint.Y, x, y))
                        {
                            stroke.PushPoint(new Point(x, y));
                            found = true;
                            break;
                        }
                        Point firstPoint = stroke.Points[0];
                        if (PointsAreNeighbors(firstPoint.X, firstPoint.Y, x, y))
                        {
                            stroke.AddPoint(new Point(x, y));
                            found = true;
                            break;
                        }
                    }
                    if (found)
                    {
                        continue;
                    }

                    strokesForEachColor[currentPixelColorIndex].Add(
                        new MouseDragAction(new List<Point> {currentPixelPoint}));
                }
            }

            foreach (var mouseDragActions in strokesForEachColor)
            {
                output.AddRange(mouseDragActions);
            }

            return output;
        }