diff --git a/LegoArt/MainWindow.xaml b/LegoArt/MainWindow.xaml index e8fbe00..9bacc80 100644 --- a/LegoArt/MainWindow.xaml +++ b/LegoArt/MainWindow.xaml @@ -31,7 +31,7 @@ - + diff --git a/LegoArt/MainWindow.xaml.cs b/LegoArt/MainWindow.xaml.cs index 0f397c4..ad0595b 100644 --- a/LegoArt/MainWindow.xaml.cs +++ b/LegoArt/MainWindow.xaml.cs @@ -7,6 +7,8 @@ using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using Rectangle = System.Windows.Shapes.Rectangle; +using LegoArtTool.LegoArtColor; +using LegoArtTool.BuildingInstruction; namespace LegoArt { @@ -19,6 +21,7 @@ namespace LegoArt private readonly BitmapHelperService bitmapHelperService; private readonly ImageHelperService imageHelperService; private readonly LegoArtImageGenerationService legoArtImageGenerationService; + private readonly BuildingInstructionService buildingInstructionService; public MainWindow() { @@ -28,6 +31,7 @@ namespace LegoArt bitmapHelperService = new BitmapHelperService(); imageHelperService = new ImageHelperService(); legoArtImageGenerationService = new LegoArtImageGenerationService(); + buildingInstructionService = new BuildingInstructionService(); btnInstructionsPersister.Visibility = Visibility.Hidden; } @@ -39,43 +43,55 @@ namespace LegoArt { tbImagePath.Text = openFileDialog.FileName; - Application.Current.Dispatcher.Invoke(() => - { - Mouse.OverrideCursor = Cursors.Wait; - }); + ShowWaitCursor(); LoadImage(openFileDialog.FileName); - Application.Current.Dispatcher.Invoke(() => - { - Mouse.OverrideCursor = null; - }); + HideWaitCursor(); } } + private void ShowWaitCursor() + { + Application.Current.Dispatcher.Invoke(() => + { + Mouse.OverrideCursor = Cursors.Wait; + }); + } + + private void HideWaitCursor() + { + Application.Current.Dispatcher.Invoke(() => + { + Mouse.OverrideCursor = null; + }); + } + private void btnInstructionsPersister_Click(object sender, RoutedEventArgs e) { - var d = new DataObject(DataFormats.Bitmap, scaledImage.Source, true); - var bitmap = d.GetData(typeof(Bitmap)) as Bitmap; - var outputPath = BuildingInstructionService.PersistBuildingInstructions(bitmap, tbImagePath.Text); - MessageBox.Show($"Instructions saved to {outputPath}", "Saved", MessageBoxButton.OK, MessageBoxImage.Information); + ShowWaitCursor(); + var d = new DataObject(DataFormats.Bitmap, legoArtImage.Source, true); + var legoArtBitmap = d.GetData(typeof(Bitmap)) as Bitmap; + var buildingInstructionBitmap = buildingInstructionService.CreateBuildingInstructionImage(legoArtBitmap, legoArtColorService.GetLegoColors()); + var outputPath = buildingInstructionService.PersistBuildingInstructions(buildingInstructionBitmap, tbImagePath.Text); + + HideWaitCursor(); + + MessageBox.Show($"Instructions saved to {outputPath}", "Saved", MessageBoxButton.OK, MessageBoxImage.Information); } private void LoadImage(string path) { - var bitmap = new System.Drawing.Bitmap(path); - var reducedBitMap = legoArtImageGenerationService.GenerateLegoArtImageFromFullColorImage(bitmap); + var sourceBitmap = new Bitmap(path); + sourceImage.Source = imageHelperService.LoadToImage(bitmapHelperService.Scale(sourceBitmap, 1)); + + var reducedBitMap = legoArtImageGenerationService.GenerateLegoArtImageFromFullColorImage(sourceBitmap); + legoArtImage.Source = imageHelperService.LoadToImage(reducedBitMap); var legoArtColors = legoArtColorService.ParseImage(reducedBitMap); if (legoArtColors != null) - { - var sourceBitmap = bitmapHelperService.Scale(reducedBitMap, 1); - sourceImage.Source = imageHelperService.LoadToImage(sourceBitmap); - - var convertedBitmap = bitmapHelperService.ConvertToPixelMatrix(sourceBitmap, legoArtColorService.GetLegoColors()); - scaledImage.Source = imageHelperService.LoadToImage(convertedBitmap); - + { btnInstructionsPersister.Visibility = Visibility.Visible; parentStackPanel.Children.Clear(); diff --git a/LegoArtTool/BitmapHelperService.cs b/LegoArtTool/BitmapHelperService.cs index 7d979ce..454ff1e 100644 --- a/LegoArtTool/BitmapHelperService.cs +++ b/LegoArtTool/BitmapHelperService.cs @@ -1,6 +1,4 @@ -using LegoArtTool.Pixels; -using System.Collections.Generic; -using System.Drawing; +using System.Drawing; namespace LegoArtTool { @@ -29,11 +27,5 @@ namespace LegoArtTool return scaledBitmap; } - - public Bitmap ConvertToPixelMatrix(Bitmap bitmap, List legoArtColors) - { - var pixelMatrix = new PixelMatrix(bitmap, legoArtColors); - return pixelMatrix.ConvertBitmap(); - } } } diff --git a/LegoArtTool/Pixels/Pixel.cs b/LegoArtTool/BuildingInstruction/BuildingInstructionElement.cs similarity index 88% rename from LegoArtTool/Pixels/Pixel.cs rename to LegoArtTool/BuildingInstruction/BuildingInstructionElement.cs index 1ddc3d2..641d76c 100644 --- a/LegoArtTool/Pixels/Pixel.cs +++ b/LegoArtTool/BuildingInstruction/BuildingInstructionElement.cs @@ -1,8 +1,8 @@ using System.Drawing; -namespace LegoArtTool.Pixels +namespace LegoArtTool.BuildingInstruction { - public class Pixel + public class BuildingInstructionElement { public Color Color { get; private set; } public int Number { get; private set; } @@ -10,7 +10,7 @@ namespace LegoArtTool.Pixels public const int PixelSize = 50; private const int NumberSize = 20; - public Pixel(Color color, int number) + public BuildingInstructionElement(Color color, int number) { Color = color; Number = number; diff --git a/LegoArtTool/Pixels/PixelMatrix.cs b/LegoArtTool/BuildingInstruction/BuildingInstructionMatrix.cs similarity index 63% rename from LegoArtTool/Pixels/PixelMatrix.cs rename to LegoArtTool/BuildingInstruction/BuildingInstructionMatrix.cs index 2a709db..a194aaa 100644 --- a/LegoArtTool/Pixels/PixelMatrix.cs +++ b/LegoArtTool/BuildingInstruction/BuildingInstructionMatrix.cs @@ -1,21 +1,19 @@ -using System; +using LegoArtTool.LegoArtColor; using System.Collections.Generic; using System.Drawing; using System.Linq; -namespace LegoArtTool.Pixels +namespace LegoArtTool.BuildingInstruction { - public class PixelMatrix + public class BuildingInstructionMatrix { - public Pixel[,] Pixels { get; private set; } + public BuildingInstructionElement[,] Pixels { get; private set; } public int MatrixSize { get; private set; } - private Random rnd = new Random(); - - public PixelMatrix(Bitmap sourceBitmap, List legoArtColors) + public BuildingInstructionMatrix(Bitmap sourceBitmap, List legoArtColors) { MatrixSize = sourceBitmap.Width; - Pixels = new Pixel[MatrixSize, MatrixSize]; + Pixels = new BuildingInstructionElement[MatrixSize, MatrixSize]; for (int x = 0; x < MatrixSize; x++) { @@ -24,14 +22,14 @@ namespace LegoArtTool.Pixels var pixel = sourceBitmap.GetPixel(x, y); var sourceColor = Color.FromArgb(pixel.ToArgb()); var legoNumber = legoArtColors.Single(l => l.Color == sourceColor).LegoNumber; - Pixels[x, y] = new Pixel(sourceColor, legoNumber); + Pixels[x, y] = new BuildingInstructionElement(sourceColor, legoNumber); } } } - public Bitmap ConvertBitmap() + public Bitmap GetBitmap() { - var bitmapSize = MatrixSize * Pixel.PixelSize; + var bitmapSize = MatrixSize * BuildingInstructionElement.PixelSize; var bitmap = new Bitmap(bitmapSize, bitmapSize); using (var g = Graphics.FromImage(bitmap)) { @@ -47,11 +45,5 @@ namespace LegoArtTool.Pixels return bitmap; } - - private Color GetRandomColor() - { - Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256)); - return randomColor; - } } } diff --git a/LegoArtTool/BuildingInstructionService.cs b/LegoArtTool/BuildingInstruction/BuildingInstructionService.cs similarity index 67% rename from LegoArtTool/BuildingInstructionService.cs rename to LegoArtTool/BuildingInstruction/BuildingInstructionService.cs index 7c28e1b..a7c7069 100644 --- a/LegoArtTool/BuildingInstructionService.cs +++ b/LegoArtTool/BuildingInstruction/BuildingInstructionService.cs @@ -1,12 +1,20 @@ -using System.Drawing; +using LegoArtTool.LegoArtColor; +using System.Collections.Generic; +using System.Drawing; using System.Drawing.Imaging; using System.IO; -namespace LegoArtTool +namespace LegoArtTool.BuildingInstruction { - public static class BuildingInstructionService + public class BuildingInstructionService { - public static string PersistBuildingInstructions(Bitmap bitmap, string path) + public Bitmap CreateBuildingInstructionImage(Bitmap bitmap, List legoArtColors) + { + var pixelMatrix = new BuildingInstructionMatrix(bitmap, legoArtColors); + return pixelMatrix.GetBitmap(); + } + + public string PersistBuildingInstructions(Bitmap bitmap, string path) { var segmentSize = bitmap.Width / 3; var outPutDirectory = CreateOutPutDirectory(path); @@ -25,7 +33,7 @@ namespace LegoArtTool return outPutDirectory; } - private static string CreateOutPutDirectory(string path) + private string CreateOutPutDirectory(string path) { var increment = 0; @@ -39,7 +47,7 @@ namespace LegoArtTool return outputDirectoryPath; } - private static string GetOutputDirectoryPath(int increment, string path) + private string GetOutputDirectoryPath(int increment, string path) { var parent = Directory.GetParent(path); var filename = Path.GetFileNameWithoutExtension(path); diff --git a/LegoArtTool/Pixels/GraphicExtensions.cs b/LegoArtTool/BuildingInstruction/GraphicExtensions.cs similarity index 97% rename from LegoArtTool/Pixels/GraphicExtensions.cs rename to LegoArtTool/BuildingInstruction/GraphicExtensions.cs index 3f3472e..d5b907e 100644 --- a/LegoArtTool/Pixels/GraphicExtensions.cs +++ b/LegoArtTool/BuildingInstruction/GraphicExtensions.cs @@ -1,7 +1,7 @@ using System.Drawing; using System.Drawing.Drawing2D; -namespace LegoArtTool.Pixels +namespace LegoArtTool.BuildingInstruction { public static class GraphicsExtensions { diff --git a/LegoArtTool/LegoArtColorInfo.cs b/LegoArtTool/LegoArtColor/LegoArtColorInfo.cs similarity index 93% rename from LegoArtTool/LegoArtColorInfo.cs rename to LegoArtTool/LegoArtColor/LegoArtColorInfo.cs index 833c591..15c10e6 100644 --- a/LegoArtTool/LegoArtColorInfo.cs +++ b/LegoArtTool/LegoArtColor/LegoArtColorInfo.cs @@ -1,6 +1,6 @@ using System.Drawing; -namespace LegoArtTool +namespace LegoArtTool.LegoArtColor { public class LegoArtColorInfo { diff --git a/LegoArtTool/LegoArtColorOffset.cs b/LegoArtTool/LegoArtColor/LegoArtColorOffset.cs similarity index 92% rename from LegoArtTool/LegoArtColorOffset.cs rename to LegoArtTool/LegoArtColor/LegoArtColorOffset.cs index 161cf6c..2656d9b 100644 --- a/LegoArtTool/LegoArtColorOffset.cs +++ b/LegoArtTool/LegoArtColor/LegoArtColorOffset.cs @@ -1,4 +1,4 @@ -namespace LegoArtTool +namespace LegoArtTool.LegoArtColor { public class LegoArtColorOffset { @@ -12,7 +12,5 @@ LegoArtColorInfo = legoArtColorInfo; IsAvailable = true; } - - } } \ No newline at end of file diff --git a/LegoArtTool/LegoArtColorService.cs b/LegoArtTool/LegoArtColor/LegoArtColorService.cs similarity index 98% rename from LegoArtTool/LegoArtColorService.cs rename to LegoArtTool/LegoArtColor/LegoArtColorService.cs index 2145b3a..f19625e 100644 --- a/LegoArtTool/LegoArtColorService.cs +++ b/LegoArtTool/LegoArtColor/LegoArtColorService.cs @@ -2,7 +2,7 @@ using System.Linq; using System.Drawing; -namespace LegoArtTool +namespace LegoArtTool.LegoArtColor { public class LegoArtColorService { diff --git a/LegoArtTool/Pixel.cs b/LegoArtTool/LegoArtColor/Pixel.cs similarity index 91% rename from LegoArtTool/Pixel.cs rename to LegoArtTool/LegoArtColor/Pixel.cs index 8798af2..85e02ed 100644 --- a/LegoArtTool/Pixel.cs +++ b/LegoArtTool/LegoArtColor/Pixel.cs @@ -1,15 +1,15 @@ using System.Collections.Generic; -namespace LegoArtTool +namespace LegoArtTool.LegoArtColor { public class Pixel - { + { public int X { get; private set; } public int Y { get; private set; } public List LegoArtColorOffsets { get; private set; } - + public bool IsAssigned { get; set; } - + public Pixel(int x, int y, List legoArtColorOffsets) { X = x; @@ -17,6 +17,5 @@ namespace LegoArtTool LegoArtColorOffsets = legoArtColorOffsets; IsAssigned = false; } - } } \ No newline at end of file diff --git a/LegoArtTool/LegoArtImageGenerationService.cs b/LegoArtTool/LegoArtImageGenerationService.cs index 15b605b..8f3e7d8 100644 --- a/LegoArtTool/LegoArtImageGenerationService.cs +++ b/LegoArtTool/LegoArtImageGenerationService.cs @@ -1,4 +1,5 @@ -using System; +using LegoArtTool.LegoArtColor; +using System; using System.Collections.Generic; using System.Drawing; using System.Linq;