From 91f205ea84de32437cd71b373f79badea313dfe0 Mon Sep 17 00:00:00 2001 From: Claudio Schaad Date: Sun, 29 Nov 2020 17:58:46 +0100 Subject: [PATCH] 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; + } + } +}