Some UI stuff
This commit is contained in:
parent
18f8c7efb3
commit
27c1ca6a9b
5 changed files with 51 additions and 24 deletions
|
|
@ -18,8 +18,8 @@
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<StackPanel Grid.Row="0" Orientation="Horizontal" Height="25" VerticalAlignment="Top">
|
<StackPanel Grid.Row="0" Orientation="Horizontal" Height="25" VerticalAlignment="Top">
|
||||||
<Label Width="50" Content="Bild:"/>
|
<Label Width="Auto" Content="Source Image:"/>
|
||||||
<TextBox Width="300" x:Name="tbImagePath" />
|
<TextBox Width="265" x:Name="tbImagePath" />
|
||||||
<Button Width="50" Name="btnImageChooser" Content="..." Click="btnImageChooser_Click"/>
|
<Button Width="50" Name="btnImageChooser" Content="..." Click="btnImageChooser_Click"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
|
|
@ -27,11 +27,16 @@
|
||||||
<Button Width="200" Name="btnInstructionsPersister" Content="Save Instructions" Click="btnInstructionsPersister_Click"/>
|
<Button Width="200" Name="btnInstructionsPersister" Content="Save Instructions" Click="btnInstructionsPersister_Click"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<StackPanel Grid.Row="2" Orientation="Vertical" Name="parentStackPanel" VerticalAlignment="Top">
|
<StackPanel Grid.Row="2" Orientation="Vertical" VerticalAlignment="Top">
|
||||||
|
<Label Name="lblLegoArtSet" />
|
||||||
|
<StackPanel Orientation="Vertical" VerticalAlignment="Top" Name="parentStackPanel">
|
||||||
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Grid.Column="1" Grid.Row="2" Orientation="Horizontal">
|
<StackPanel Grid.Column="1" Grid.Row="2" Orientation="Vertical">
|
||||||
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="sourceImage" Stretch="None"/>
|
<Label Name="lblSourceImage" Visibility="Hidden">Source Image:</Label>
|
||||||
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="legoArtImage" Stretch="None"/>
|
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="sourceImage" Stretch="None"/>
|
||||||
|
<Label Name="lblLegoArtImage" Visibility="Hidden">LEGO® Art Image:</Label>
|
||||||
|
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="legoArtImage" Stretch="None"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ using System.Windows.Media;
|
||||||
using Rectangle = System.Windows.Shapes.Rectangle;
|
using Rectangle = System.Windows.Shapes.Rectangle;
|
||||||
using LegoArtTool.LegoArtColor;
|
using LegoArtTool.LegoArtColor;
|
||||||
using LegoArtTool.BuildingInstruction;
|
using LegoArtTool.BuildingInstruction;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace LegoArt
|
namespace LegoArt
|
||||||
{
|
{
|
||||||
|
|
@ -23,6 +24,8 @@ namespace LegoArt
|
||||||
private readonly LegoArtImageGenerationService legoArtImageGenerationService;
|
private readonly LegoArtImageGenerationService legoArtImageGenerationService;
|
||||||
private readonly BuildingInstructionService buildingInstructionService;
|
private readonly BuildingInstructionService buildingInstructionService;
|
||||||
|
|
||||||
|
private string currentLegoArtSet;
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
@ -34,6 +37,7 @@ namespace LegoArt
|
||||||
buildingInstructionService = new BuildingInstructionService();
|
buildingInstructionService = new BuildingInstructionService();
|
||||||
|
|
||||||
btnInstructionsPersister.Visibility = Visibility.Hidden;
|
btnInstructionsPersister.Visibility = Visibility.Hidden;
|
||||||
|
currentLegoArtSet = legoArtColorService.LegoArtSets.First();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnImageChooser_Click(object sender, RoutedEventArgs e)
|
private void btnImageChooser_Click(object sender, RoutedEventArgs e)
|
||||||
|
|
@ -73,7 +77,7 @@ namespace LegoArt
|
||||||
|
|
||||||
var d = new DataObject(DataFormats.Bitmap, legoArtImage.Source, true);
|
var d = new DataObject(DataFormats.Bitmap, legoArtImage.Source, true);
|
||||||
var legoArtBitmap = d.GetData(typeof(Bitmap)) as Bitmap;
|
var legoArtBitmap = d.GetData(typeof(Bitmap)) as Bitmap;
|
||||||
var buildingInstructionBitmap = buildingInstructionService.CreateBuildingInstructionImage(legoArtBitmap, legoArtColorService.GetLegoColors());
|
var buildingInstructionBitmap = buildingInstructionService.CreateBuildingInstructionImage(legoArtBitmap, legoArtColorService.GetLegoArtColorSet(currentLegoArtSet));
|
||||||
var outputPath = buildingInstructionService.PersistBuildingInstructions(buildingInstructionBitmap, tbImagePath.Text);
|
var outputPath = buildingInstructionService.PersistBuildingInstructions(buildingInstructionBitmap, tbImagePath.Text);
|
||||||
|
|
||||||
HideWaitCursor();
|
HideWaitCursor();
|
||||||
|
|
@ -85,15 +89,18 @@ namespace LegoArt
|
||||||
{
|
{
|
||||||
var sourceBitmap = new Bitmap(path);
|
var sourceBitmap = new Bitmap(path);
|
||||||
sourceImage.Source = imageHelperService.LoadToImage(bitmapHelperService.Scale(sourceBitmap, 1));
|
sourceImage.Source = imageHelperService.LoadToImage(bitmapHelperService.Scale(sourceBitmap, 1));
|
||||||
|
lblSourceImage.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
var reducedBitMap = legoArtImageGenerationService.GenerateLegoArtImageFromFullColorImage(sourceBitmap);
|
var reducedBitMap = legoArtImageGenerationService.GenerateLegoArtImageFromFullColorImage(sourceBitmap, currentLegoArtSet);
|
||||||
legoArtImage.Source = imageHelperService.LoadToImage(reducedBitMap);
|
legoArtImage.Source = imageHelperService.LoadToImage(reducedBitMap);
|
||||||
|
lblLegoArtImage.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
var legoArtColors = legoArtColorService.ParseImage(reducedBitMap);
|
var legoArtColors = legoArtColorService.ParseImage(reducedBitMap, currentLegoArtSet);
|
||||||
if (legoArtColors != null)
|
if (legoArtColors != null)
|
||||||
{
|
{
|
||||||
btnInstructionsPersister.Visibility = Visibility.Visible;
|
btnInstructionsPersister.Visibility = Visibility.Visible;
|
||||||
|
lblLegoArtSet.Content = currentLegoArtSet;
|
||||||
|
|
||||||
parentStackPanel.Children.Clear();
|
parentStackPanel.Children.Clear();
|
||||||
|
|
||||||
AddLine(System.Drawing.Color.White, "Have", "Needed", "RGB", "#", "Difference", System.Drawing.Color.White);
|
AddLine(System.Drawing.Color.White, "Have", "Needed", "RGB", "#", "Difference", System.Drawing.Color.White);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using LegoArtTool.LegoArtColor;
|
using LegoArtTool.LegoArtColor;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
|
|
@ -26,7 +27,7 @@ namespace LegoArtTool.BuildingInstruction
|
||||||
{
|
{
|
||||||
var rectangle = new Rectangle(w * segmentSize, h * segmentSize, segmentSize, segmentSize);
|
var rectangle = new Rectangle(w * segmentSize, h * segmentSize, segmentSize, segmentSize);
|
||||||
var segment = bitmap.Clone(rectangle, bitmap.PixelFormat);
|
var segment = bitmap.Clone(rectangle, bitmap.PixelFormat);
|
||||||
segment.Save($"{outPutDirectory}/{segmentNumber++}.png", ImageFormat.Png);
|
segment.Save($"{outPutDirectory}{Path.DirectorySeparatorChar}{segmentNumber++}.png", ImageFormat.Png);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -51,7 +52,7 @@ namespace LegoArtTool.BuildingInstruction
|
||||||
{
|
{
|
||||||
var parent = Directory.GetParent(path);
|
var parent = Directory.GetParent(path);
|
||||||
var filename = Path.GetFileNameWithoutExtension(path);
|
var filename = Path.GetFileNameWithoutExtension(path);
|
||||||
return increment == 0 ? $"{parent}/legoArtInstructions" : $"{parent}/legoArtInstructions_{filename} ({increment})";
|
return increment == 0 ? $"{parent}{Path.DirectorySeparatorChar}legoArtInstructions" : $"{parent}{Path.DirectorySeparatorChar}legoArtInstructions_{filename} ({increment})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6,10 +6,16 @@ namespace LegoArtTool.LegoArtColor
|
||||||
{
|
{
|
||||||
public class LegoArtColorService
|
public class LegoArtColorService
|
||||||
{
|
{
|
||||||
public List<LegoArtColorInfo> GetLegoColors()
|
public List<string> LegoArtSets { get; private set;}
|
||||||
{
|
|
||||||
var legoColors = new List<LegoArtColorInfo>();
|
|
||||||
|
|
||||||
|
private readonly Dictionary<string, List<LegoArtColorInfo>> legoArtColorSets;
|
||||||
|
|
||||||
|
public LegoArtColorService()
|
||||||
|
{
|
||||||
|
legoArtColorSets = new Dictionary<string, List<LegoArtColorInfo>>();
|
||||||
|
|
||||||
|
var key = "LEGO® Art The Beatles #31198";
|
||||||
|
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));
|
||||||
|
|
@ -25,13 +31,20 @@ namespace LegoArtTool.LegoArtColor
|
||||||
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));
|
||||||
|
legoArtColorSets.Add(key, legoColors);
|
||||||
|
|
||||||
return legoColors;
|
LegoArtSets = new List<string>();
|
||||||
|
LegoArtSets.Add(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<LegoArtColorInfo> ParseImage(Bitmap bitmap)
|
public List<LegoArtColorInfo> GetLegoArtColorSet(string legoArtSetKey)
|
||||||
{
|
{
|
||||||
var parsedLegoColors = GetLegoColors();
|
return legoArtColorSets[legoArtSetKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<LegoArtColorInfo> ParseImage(Bitmap bitmap, string legoArtSetKey)
|
||||||
|
{
|
||||||
|
var parsedLegoColors = GetLegoArtColorSet(legoArtSetKey);
|
||||||
|
|
||||||
var width = bitmap.Width;
|
var width = bitmap.Width;
|
||||||
var height = bitmap.Height;
|
var height = bitmap.Height;
|
||||||
|
|
|
||||||
|
|
@ -8,16 +8,17 @@ namespace LegoArtTool
|
||||||
{
|
{
|
||||||
public class LegoArtImageGenerationService
|
public class LegoArtImageGenerationService
|
||||||
{
|
{
|
||||||
private readonly List<LegoArtColorInfo> legoArtColorInfos;
|
private readonly LegoArtColorService legoArtColorService;
|
||||||
|
|
||||||
public LegoArtImageGenerationService()
|
public LegoArtImageGenerationService()
|
||||||
{
|
{
|
||||||
var legoArtColorService = new LegoArtColorService();
|
legoArtColorService = new LegoArtColorService();
|
||||||
legoArtColorInfos = legoArtColorService.GetLegoColors();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap GenerateLegoArtImageFromFullColorImage(Bitmap bitmap)
|
public Bitmap GenerateLegoArtImageFromFullColorImage(Bitmap bitmap, string legoArtSetKey)
|
||||||
{
|
{
|
||||||
|
var legoArtColorInfos = legoArtColorService.GetLegoArtColorSet(legoArtSetKey);
|
||||||
|
|
||||||
var width = bitmap.Width;
|
var width = bitmap.Width;
|
||||||
var height = bitmap.Height;
|
var height = bitmap.Height;
|
||||||
|
|
||||||
|
|
@ -28,7 +29,7 @@ namespace LegoArtTool
|
||||||
for (int w = 0; w < width; w++)
|
for (int w = 0; w < width; w++)
|
||||||
{
|
{
|
||||||
var color = bitmap.GetPixel(h, w);
|
var color = bitmap.GetPixel(h, w);
|
||||||
var pixel = MapPixel(color, h ,w);
|
var pixel = MapPixel(legoArtColorInfos, color, h ,w);
|
||||||
pixels.Add(pixel);
|
pixels.Add(pixel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -63,7 +64,7 @@ namespace LegoArtTool
|
||||||
return reducedBitmap;
|
return reducedBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Pixel MapPixel(Color inputColor, int xPosition, int yPosition)
|
private Pixel MapPixel(List<LegoArtColorInfo> legoArtColorInfos, Color inputColor, int xPosition, int yPosition)
|
||||||
{
|
{
|
||||||
var legoArtColorOffsets = legoArtColorInfos.Select(i => ColorDistance(inputColor, i)).ToList();
|
var legoArtColorOffsets = legoArtColorInfos.Select(i => ColorDistance(inputColor, i)).ToList();
|
||||||
return new Pixel(xPosition, yPosition, legoArtColorOffsets);
|
return new Pixel(xPosition, yPosition, legoArtColorOffsets);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue