Merge remote-tracking branch 'origin/main' into imagegenerator

# Conflicts:
#	LegoArtTool/LegoArtColorService.cs
This commit is contained in:
Nadina Siddiqui 2020-11-29 18:19:54 +01:00
commit ae03d247a2
7 changed files with 157 additions and 42 deletions

View file

@ -13,7 +13,7 @@
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" /> <ColumnDefinition Width="400" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
@ -25,7 +25,7 @@
<StackPanel Grid.Row="2" Orientation="Vertical" Name="parentStackPanel" VerticalAlignment="Top"> <StackPanel Grid.Row="2" Orientation="Vertical" Name="parentStackPanel" VerticalAlignment="Top">
</StackPanel> </StackPanel>
<StackPanel Grid.Column="1" Grid.Row="2" Orientation="Vertical"> <StackPanel Grid.Column="1" Grid.Row="2" Orientation="Horizontal">
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="sourceImage" Stretch="None"/> <Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="sourceImage" Stretch="None"/>
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="scaledImage" Stretch="None"/> <Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="scaledImage" Stretch="None"/>
</StackPanel> </StackPanel>

View file

@ -3,6 +3,7 @@ using Microsoft.Win32;
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Shapes; using System.Windows.Shapes;
@ -16,6 +17,7 @@ namespace LegoArt
private readonly LegoArtColorService legoArtColorService; private readonly LegoArtColorService legoArtColorService;
private readonly BitmapHelperService bitmapHelperService; private readonly BitmapHelperService bitmapHelperService;
private readonly ImageHelperService imageHelperService; private readonly ImageHelperService imageHelperService;
private LegoArtImageGenerationService legoArtImageGenerationService;
public MainWindow() public MainWindow()
{ {
@ -24,6 +26,7 @@ namespace LegoArt
legoArtColorService = new LegoArtColorService(); legoArtColorService = new LegoArtColorService();
bitmapHelperService = new BitmapHelperService(); bitmapHelperService = new BitmapHelperService();
imageHelperService = new ImageHelperService(); imageHelperService = new ImageHelperService();
legoArtImageGenerationService = new LegoArtImageGenerationService();
} }
private void btnImageChooser_Click(object sender, RoutedEventArgs e) private void btnImageChooser_Click(object sender, RoutedEventArgs e)
@ -32,20 +35,34 @@ namespace LegoArt
if (openFileDialog.ShowDialog() == true) if (openFileDialog.ShowDialog() == true)
{ {
tbImagePath.Text = openFileDialog.FileName; tbImagePath.Text = openFileDialog.FileName;
Application.Current.Dispatcher.Invoke(() =>
{
Mouse.OverrideCursor = Cursors.Wait;
});
LoadImage(openFileDialog.FileName); LoadImage(openFileDialog.FileName);
Application.Current.Dispatcher.Invoke(() =>
{
Mouse.OverrideCursor = null;
});
} }
} }
private void LoadImage(string path) 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) if (legoArtColors != null)
{ {
var sourceBitamp = bitmapHelperService.ScaleImage(path, 1); var sourceBitmap = bitmapHelperService.Scale(reducedBitMap, 1);
sourceImage.Source = imageHelperService.LoadToImage(sourceBitamp); sourceImage.Source = imageHelperService.LoadToImage(sourceBitmap);
var scaledBitamp = bitmapHelperService.ScaleImage(path, 5); var convertedBitmap = bitmapHelperService.ConvertToPixelMatrix(sourceBitmap, 20);
scaledImage.Source = imageHelperService.LoadToImage(scaledBitamp); scaledImage.Source = imageHelperService.LoadToImage(convertedBitmap);
parentStackPanel.Children.Clear(); parentStackPanel.Children.Clear();

View file

@ -1,24 +1,26 @@
using System.Drawing; using LegoArtTool.Pixels;
using System.Drawing;
namespace LegoArtTool namespace LegoArtTool
{ {
public class BitmapHelperService 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(bitmap.Width * scaleFactor, bitmap.Height * scaleFactor);
var scaledBitmap = new Bitmap(inputBitmap.Width * scaleFactor, inputBitmap.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 scaleX = x * scaleFactor; scaleX < scaledBitmap.Width; scaleX++)
{ {
for (int scaleY = y * scaleFactor; scaleY < scaledBitmap.Height; scaleY++) 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; return scaledBitmap;
} }
public Bitmap ConvertToPixelMatrix(Bitmap bitmap, int pixelSize)
{
var pixelMatrix = new PixelMatrix(pixelSize, bitmap);
return pixelMatrix.ConvertBitmap();
}
} }
} }

View file

@ -6,32 +6,32 @@ namespace LegoArtTool
{ {
public class LegoArtColorService public class LegoArtColorService
{ {
public static readonly List<LegoArtColorInfo> LegoColors; public List<LegoArtColorInfo> GetLegoColors()
static LegoArtColorService()
{ {
LegoColors = new List<LegoArtColorInfo>(); var legoColors = new List<LegoArtColorInfo>();
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(0, 0, 0), 1, 698)); 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(102, 101, 96), 2, 141));
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(167, 166, 162), 3, 51)); 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(246, 246, 248), 4, 149));
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(0, 53, 94), 5, 121)); 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(101, 135, 162), 6, 52));
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(121, 196, 236), 7, 57)); 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(253, 104, 0), 8, 74));
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(255, 170, 0), 9, 65)); 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(229, 205, 135), 10, 283));
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(163, 129, 93), 11, 137)); 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(196, 115, 54), 12, 29));
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(206, 81, 0), 13, 85)); 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(119, 40, 0), 14, 250));
LegoColors.Add(new LegoArtColorInfo(Color.FromArgb(66, 23, 3), 15, 554)); legoColors.Add(new LegoArtColorInfo(Color.FromArgb(66, 23, 3), 15, 554));
return legoColors;
} }
public static List<LegoArtColorInfo> ParseImage(Bitmap bitmap) public List<LegoArtColorInfo> ParseImage(Bitmap bitmap)
{ {
var parsedLegoColors = new List<LegoArtColorInfo>(LegoColors); var parsedLegoColors = GetLegoColors();
var width = bitmap.Width; var width = bitmap.Width;
var height = bitmap.Height; var height = bitmap.Height;

View file

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
@ -8,7 +7,14 @@ namespace LegoArtTool
{ {
public class LegoArtImageGenerationService public class LegoArtImageGenerationService
{ {
[SuppressMessage("ReSharper.DPA", "DPA0002: Excessive memory allocations in SOH", MessageId = "type: WhereListIterator`1[LegoArtTool.LegoArtColorOffset]")] private readonly List<LegoArtColorInfo> legoArtColorInfos;
public LegoArtImageGenerationService()
{
var legoArtColorService = new LegoArtColorService();
legoArtColorInfos = legoArtColorService.GetLegoColors();
}
public Bitmap GenerateLegoArtImageFromFullColorImage(Bitmap bitmap) public Bitmap GenerateLegoArtImageFromFullColorImage(Bitmap bitmap)
{ {
var width = bitmap.Width; var width = bitmap.Width;
@ -28,7 +34,6 @@ namespace LegoArtTool
var reducedBitmap = new Bitmap(bitmap.Width, bitmap.Height); var reducedBitmap = new Bitmap(bitmap.Width, bitmap.Height);
var legoArtColorInfos = LegoArtColorService.LegoColors;
var remainingColors = legoArtColorInfos.ToDictionary(k => k.LegoNumber, v => v.HaveCount); var remainingColors = legoArtColorInfos.ToDictionary(k => k.LegoNumber, v => v.HaveCount);
@ -62,10 +67,7 @@ namespace LegoArtTool
int xPosition, int xPosition,
int yPosition) int yPosition)
{ {
var legoArtColorInfos = LegoArtColorService.LegoColors;
var legoArtColorOffsets = legoArtColorInfos.Select(i => ColorOffset(inputColor, i)).ToList(); var legoArtColorOffsets = legoArtColorInfos.Select(i => ColorOffset(inputColor, i)).ToList();
return new Pixel(xPosition, yPosition, legoArtColorOffsets); return new Pixel(xPosition, yPosition, legoArtColorOffsets);
} }

View file

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

View file

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