From 91f205ea84de32437cd71b373f79badea313dfe0 Mon Sep 17 00:00:00 2001 From: Claudio Schaad Date: Sun, 29 Nov 2020 17:58:46 +0100 Subject: [PATCH 1/2] Added pixel matrix --- LegoArt/MainWindow.xaml | 4 +-- LegoArt/MainWindow.xaml.cs | 19 ++++++++-- LegoArtTool/BitmapHelperService.cs | 24 ++++++++----- LegoArtTool/Pixels/Pixel.cs | 32 +++++++++++++++++ LegoArtTool/Pixels/PixelMatrix.cs | 56 ++++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 LegoArtTool/Pixels/Pixel.cs create mode 100644 LegoArtTool/Pixels/PixelMatrix.cs 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..6752e66 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; @@ -32,7 +33,18 @@ 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; + }); } } @@ -41,11 +53,12 @@ namespace LegoArt var legoArtColors = legoArtColorService.ParseImage(path); if (legoArtColors != null) { - var sourceBitamp = bitmapHelperService.ScaleImage(path, 1); + var bitmap = new System.Drawing.Bitmap(path); + var sourceBitamp = bitmapHelperService.Scale(bitmap, 1); sourceImage.Source = imageHelperService.LoadToImage(sourceBitamp); - var scaledBitamp = bitmapHelperService.ScaleImage(path, 5); - scaledImage.Source = imageHelperService.LoadToImage(scaledBitamp); + var convertedBitmap = bitmapHelperService.ConvertToPixelMatrix(sourceBitamp, 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/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; + } + } +} From d0ed93b7a77b1b5f0e60ca18565cc69852bec0c6 Mon Sep 17 00:00:00 2001 From: Claudio Schaad Date: Sun, 29 Nov 2020 18:09:05 +0100 Subject: [PATCH 2/2] Fix loading image --- LegoArt/MainWindow.xaml.cs | 4 +-- LegoArtTool/LegoArtColorService.cs | 43 +++++++++++++++--------------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/LegoArt/MainWindow.xaml.cs b/LegoArt/MainWindow.xaml.cs index 6752e66..e192989 100644 --- a/LegoArt/MainWindow.xaml.cs +++ b/LegoArt/MainWindow.xaml.cs @@ -50,10 +50,10 @@ namespace LegoArt private void LoadImage(string path) { - var legoArtColors = legoArtColorService.ParseImage(path); + var bitmap = new System.Drawing.Bitmap(path); + var legoArtColors = legoArtColorService.ParseImage(bitmap); if (legoArtColors != null) { - var bitmap = new System.Drawing.Bitmap(path); var sourceBitamp = bitmapHelperService.Scale(bitmap, 1); sourceImage.Source = imageHelperService.LoadToImage(sourceBitamp); diff --git a/LegoArtTool/LegoArtColorService.cs b/LegoArtTool/LegoArtColorService.cs index 6b05cd6..2145b3a 100644 --- a/LegoArtTool/LegoArtColorService.cs +++ b/LegoArtTool/LegoArtColorService.cs @@ -6,34 +6,33 @@ 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 List ParseImage(string imagePath) + public List ParseImage(Bitmap bitmap) { - var parsedLegoColors = new List(LegoColors); + var parsedLegoColors = GetLegoColors(); - var bitmap = new Bitmap(imagePath); var width = bitmap.Width; var height = bitmap.Height; for (int h = 0; h < height; h++)