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