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); }