示例#1
0
        public void Generate(string basicImagePath, int width, int height, int tileSize)
        {
            var basicImage      = Image.FromFile(basicImagePath);
            var basicImageSamll = new Bitmap(Resize(basicImage, width, height));

            var tilesCollection = new TilesCollection(_sourceDirectory, _progressNotificator);

            tilesCollection.Fill(tileSize);

            Bitmap outputImage;

            try
            {
                outputImage = new Bitmap(width * tileSize, height * tileSize);
            }
            catch (ArgumentException e)
            {
                throw new OutputImageIsToLargeException();
            }
            var sourceArea = new Rectangle(0, 0, tileSize, tileSize);

            var totalTiles     = width * height;
            var processedTiles = 0;

            using (var g = Graphics.FromImage(outputImage))
            {
                for (var x = 0; x < width; x++)
                {
                    for (var y = 0; y < height; y++)
                    {
                        var hsv            = basicImageSamll.GetPixel(x, y).ToHsv();
                        var temporaryImage = tilesCollection.FindTileSimilarToColor(hsv);
                        using (var tile = temporaryImage.ChangeHueAndSaturation(hsv))
                        {
                            var targetArea = new Rectangle(x * tileSize, y * tileSize, tileSize, tileSize);
                            g.DrawImage(tile, targetArea, sourceArea, GraphicsUnit.Pixel);
                        }
                        processedTiles++;
                        _progressNotificator.NotifyGeneratingProgress(processedTiles, totalTiles);
                    }
                }
            }

            _outputDirectory.Save(outputImage);
        }