diff --git a/LegoArt/MainWindow.xaml b/LegoArt/MainWindow.xaml index fdba1e4..a35584c 100644 --- a/LegoArt/MainWindow.xaml +++ b/LegoArt/MainWindow.xaml @@ -13,7 +13,7 @@ - + @@ -25,7 +25,7 @@ - + diff --git a/LegoArt/MainWindow.xaml.cs b/LegoArt/MainWindow.xaml.cs index 1ae72fd..c2a89cf 100644 --- a/LegoArt/MainWindow.xaml.cs +++ b/LegoArt/MainWindow.xaml.cs @@ -3,6 +3,7 @@ using Microsoft.Win32; using System.Linq; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; @@ -16,6 +17,7 @@ namespace LegoArt private readonly LegoArtColorService legoArtColorService; private readonly BitmapHelperService bitmapHelperService; private readonly ImageHelperService imageHelperService; + private LegoArtImageGenerationService legoArtImageGenerationService; public MainWindow() { @@ -24,6 +26,7 @@ namespace LegoArt legoArtColorService = new LegoArtColorService(); bitmapHelperService = new BitmapHelperService(); imageHelperService = new ImageHelperService(); + legoArtImageGenerationService = new LegoArtImageGenerationService(); } private void btnImageChooser_Click(object sender, RoutedEventArgs e) @@ -32,20 +35,34 @@ namespace LegoArt if (openFileDialog.ShowDialog() == true) { tbImagePath.Text = openFileDialog.FileName; + + Application.Current.Dispatcher.Invoke(() => + { + Mouse.OverrideCursor = Cursors.Wait; + }); + LoadImage(openFileDialog.FileName); + + Application.Current.Dispatcher.Invoke(() => + { + Mouse.OverrideCursor = null; + }); } } private void LoadImage(string path) { - var legoArtColors = legoArtColorService.ParseImage(path); + var bitmap = new System.Drawing.Bitmap(path); + var reducedBitMap = legoArtImageGenerationService.GenerateLegoArtImageFromFullColorImage(bitmap); + + var legoArtColors = legoArtColorService.ParseImage(reducedBitMap); if (legoArtColors != null) { - var sourceBitamp = bitmapHelperService.ScaleImage(path, 1); - sourceImage.Source = imageHelperService.LoadToImage(sourceBitamp); + var sourceBitmap = bitmapHelperService.Scale(reducedBitMap, 1); + sourceImage.Source = imageHelperService.LoadToImage(sourceBitmap); - var scaledBitamp = bitmapHelperService.ScaleImage(path, 5); - scaledImage.Source = imageHelperService.LoadToImage(scaledBitamp); + var convertedBitmap = bitmapHelperService.ConvertToPixelMatrix(sourceBitmap, 20); + scaledImage.Source = imageHelperService.LoadToImage(convertedBitmap); parentStackPanel.Children.Clear(); diff --git a/LegoArtTool/BitmapHelperService.cs b/LegoArtTool/BitmapHelperService.cs index 802f2ba..cdf4af0 100644 --- a/LegoArtTool/BitmapHelperService.cs +++ b/LegoArtTool/BitmapHelperService.cs @@ -1,24 +1,26 @@ -using System.Drawing; +using LegoArtTool.Pixels; +using System.Drawing; namespace LegoArtTool { public class BitmapHelperService { - public Bitmap ScaleImage(string path, int scaleFactor) + public Bitmap Scale(Bitmap bitmap, int scaleFactor) { - var inputBitmap = new Bitmap(path); - var scaledBitmap = new Bitmap(inputBitmap.Width * scaleFactor, inputBitmap.Height * scaleFactor); + var scaledBitmap = new Bitmap(bitmap.Width * scaleFactor, bitmap.Height * scaleFactor); - for (int x = 0; x < inputBitmap.Width; x++) + for (int x = 0; x < bitmap.Width; x++) { - for (int y = 0; y < inputBitmap.Height; y++) + for (int y = 0; y < bitmap.Height; y++) { - var sourcePixel = inputBitmap.GetPixel(x, y); + var sourcePixel = bitmap.GetPixel(x, y); + var sourceColor = Color.FromArgb(sourcePixel.ToArgb()); + for (int scaleX = x * scaleFactor; scaleX < scaledBitmap.Width; scaleX++) { for (int scaleY = y * scaleFactor; scaleY < scaledBitmap.Height; scaleY++) { - scaledBitmap.SetPixel(scaleX, scaleY, Color.FromArgb(sourcePixel.ToArgb())); + scaledBitmap.SetPixel(scaleX, scaleY, sourceColor); } } } @@ -26,5 +28,11 @@ namespace LegoArtTool return scaledBitmap; } + + public Bitmap ConvertToPixelMatrix(Bitmap bitmap, int pixelSize) + { + var pixelMatrix = new PixelMatrix(pixelSize, bitmap); + return pixelMatrix.ConvertBitmap(); + } } } diff --git a/LegoArtTool/LegoArtColorService.cs b/LegoArtTool/LegoArtColorService.cs index 36b422b..2145b3a 100644 --- a/LegoArtTool/LegoArtColorService.cs +++ b/LegoArtTool/LegoArtColorService.cs @@ -6,32 +6,32 @@ namespace LegoArtTool { public class LegoArtColorService { - public static readonly List LegoColors; - - static LegoArtColorService() + public List GetLegoColors() { - LegoColors = new List(); + var legoColors = new List(); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(0, 0, 0), 1, 698)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(102, 101, 96), 2, 141)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(167, 166, 162), 3, 51)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(246, 246, 248), 4, 149)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(0, 53, 94), 5, 121)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(101, 135, 162), 6, 52)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(121, 196, 236), 7, 57)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(253, 104, 0), 8, 74)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(255, 170, 0), 9, 65)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(229, 205, 135), 10, 283)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(163, 129, 93), 11, 137)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(196, 115, 54), 12, 29)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(206, 81, 0), 13, 85)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(119, 40, 0), 14, 250)); - LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(66, 23, 3), 15, 554)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(0, 0, 0), 1, 698)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(102, 101, 96), 2, 141)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(167, 166, 162), 3, 51)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(246, 246, 248), 4, 149)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(0, 53, 94), 5, 121)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(101, 135, 162), 6, 52)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(121, 196, 236), 7, 57)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(253, 104, 0), 8, 74)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(255, 170, 0), 9, 65)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(229, 205, 135), 10, 283)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(163, 129, 93), 11, 137)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(196, 115, 54), 12, 29)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(206, 81, 0), 13, 85)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(119, 40, 0), 14, 250)); + legoColors.Add(new LegoArtColorInfo(Color.FromArgb(66, 23, 3), 15, 554)); + + return legoColors; } - public static List ParseImage(Bitmap bitmap) + public List ParseImage(Bitmap bitmap) { - var parsedLegoColors = new List(LegoColors); + var parsedLegoColors = GetLegoColors(); var width = bitmap.Width; var height = bitmap.Height; diff --git a/LegoArtTool/LegoArtImageGenerationService.cs b/LegoArtTool/LegoArtImageGenerationService.cs index ea7bdf0..ea9116c 100644 --- a/LegoArtTool/LegoArtImageGenerationService.cs +++ b/LegoArtTool/LegoArtImageGenerationService.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Linq; @@ -8,7 +7,14 @@ namespace LegoArtTool { public class LegoArtImageGenerationService { - [SuppressMessage("ReSharper.DPA", "DPA0002: Excessive memory allocations in SOH", MessageId = "type: WhereListIterator`1[LegoArtTool.LegoArtColorOffset]")] + private readonly List legoArtColorInfos; + + public LegoArtImageGenerationService() + { + var legoArtColorService = new LegoArtColorService(); + legoArtColorInfos = legoArtColorService.GetLegoColors(); + } + public Bitmap GenerateLegoArtImageFromFullColorImage(Bitmap bitmap) { var width = bitmap.Width; @@ -28,7 +34,6 @@ namespace LegoArtTool var reducedBitmap = new Bitmap(bitmap.Width, bitmap.Height); - var legoArtColorInfos = LegoArtColorService.LegoColors; var remainingColors = legoArtColorInfos.ToDictionary(k => k.LegoNumber, v => v.HaveCount); @@ -62,10 +67,7 @@ namespace LegoArtTool int xPosition, int yPosition) { - var legoArtColorInfos = LegoArtColorService.LegoColors; - var legoArtColorOffsets = legoArtColorInfos.Select(i => ColorOffset(inputColor, i)).ToList(); - return new Pixel(xPosition, yPosition, legoArtColorOffsets); } diff --git a/LegoArtTool/Pixels/Pixel.cs b/LegoArtTool/Pixels/Pixel.cs new file mode 100644 index 0000000..5aba4ee --- /dev/null +++ b/LegoArtTool/Pixels/Pixel.cs @@ -0,0 +1,32 @@ +using System.Drawing; + +namespace LegoArtTool.Pixels +{ + public class Pixel + { + public Color Color { get; private set; } + public int Number { get; private set; } + public int Size { get; private set; } + + public Pixel(Color color, int size, int number) + { + Color = color; + Size = size; + Number = number; + } + + public Bitmap GetBitmap() + { + var bitmap = new Bitmap(Size, Size); + for (int x = 0; x < Size; x++) + { + for (int y = 0; y < Size; y++) + { + bitmap.SetPixel(x, y, Color); + } + } + + return bitmap; + } + } +} diff --git a/LegoArtTool/Pixels/PixelMatrix.cs b/LegoArtTool/Pixels/PixelMatrix.cs new file mode 100644 index 0000000..10317b2 --- /dev/null +++ b/LegoArtTool/Pixels/PixelMatrix.cs @@ -0,0 +1,56 @@ +using System; +using System.Drawing; + +namespace LegoArtTool.Pixels +{ + public class PixelMatrix + { + public Pixel[,] Pixels { get; private set; } + public int MatrixSize { get; private set; } + public int PixelSize { get; private set; } + + private Random rnd = new Random(); + + public PixelMatrix(int pixelSize, Bitmap sourceBitmap) + { + MatrixSize = sourceBitmap.Width; + PixelSize = pixelSize; + Pixels = new Pixel[MatrixSize, MatrixSize]; + + for (int x = 0; x < MatrixSize; x++) + { + for (int y = 0; y < MatrixSize; y++) + { + var pixel = sourceBitmap.GetPixel(x, y); + var sourceColor = Color.FromArgb(pixel.ToArgb()); + Pixels[x, y] = new Pixel(sourceColor, PixelSize, 9); + } + } + } + + public Bitmap ConvertBitmap() + { + var bitmapSize = MatrixSize * PixelSize; + var bitmap = new Bitmap(bitmapSize, bitmapSize); + using (var g = Graphics.FromImage(bitmap)) + { + for (int x = 0; x < MatrixSize; x++) + { + for (int y = 0; y < MatrixSize; y++) + { + var pixelBitmap = Pixels[x, y].GetBitmap(); + g.DrawImage(pixelBitmap, x * pixelBitmap.Width, y * pixelBitmap.Height); + } + } + } + + return bitmap; + } + + private Color GetRandomColor() + { + Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256)); + return randomColor; + } + } +}