diff --git a/LegoArt/MainWindow.xaml.cs b/LegoArt/MainWindow.xaml.cs index 43258ef..53f4e80 100644 --- a/LegoArt/MainWindow.xaml.cs +++ b/LegoArt/MainWindow.xaml.cs @@ -30,38 +30,32 @@ namespace LegoArt private void LoadImage(string path) { - var legoColorService = new LegoColorService(); - - var bitmap = new System.Drawing.Bitmap(path); - var width = bitmap.Width; - var height = bitmap.Height; - for (int h = 0; h < height; h++) + var legoArtColorService = new LegoArtColorService(); + var legoArtColors = legoArtColorService.ParseImage(path); + if (legoArtColors != null) { - for (int w = 0; w < width; w++) + parentStackPanel.Children.Clear(); + + AddLine(System.Drawing.Color.White, "Have", "Needed", "RGB", "#", "Difference", System.Drawing.Color.White); + + var sortedColors = legoArtColors.OrderBy(c => c.LegoNumber).ToList(); + for (int i = 0; i < sortedColors.Count; i++) { - var clr = bitmap.GetPixel(h, w); - var legoColorInfo = legoColorService.GetColorInfo(clr); - legoColorInfo.NeedCount++; + var color = sortedColors[i].Color; + var textRgb = $"{color.R};{color.G};{color.B}"; + var difference = sortedColors[i].HaveCount - sortedColors[i].NeedCount; + var statusColor = difference < 0 ? System.Drawing.Color.Red : System.Drawing.Color.Green; + AddLine(color, sortedColors[i].HaveCount.ToString(), sortedColors[i].NeedCount.ToString(), textRgb, sortedColors[i].LegoNumber.ToString(), difference.ToString(), statusColor); } + + var have = legoArtColors.Sum(l => l.HaveCount); + var needed = legoArtColors.Sum(l => l.NeedCount); + AddLine(System.Drawing.Color.White, have.ToString(), needed.ToString(), "Total:", "", "", System.Drawing.Color.White); } - - parentStackPanel.Children.Clear(); - - AddLine(System.Drawing.Color.White, "Have", "Needed", "RGB", "#", "Difference", System.Drawing.Color.White); - - var sortedColors = legoColorService.LegoColors.OrderBy(c => c.LegoNumber).ToList(); - for (int i = 0; i < sortedColors.Count; i++) + else { - var color = sortedColors[i].Color; - var textRgb = $"{color.R};{color.G};{color.B}"; - var difference = sortedColors[i].HaveCount - sortedColors[i].NeedCount; - var statusColor = difference < 0 ? System.Drawing.Color.Red : System.Drawing.Color.Green; - AddLine(color, sortedColors[i].HaveCount.ToString(), sortedColors[i].NeedCount.ToString(), textRgb, sortedColors[i].LegoNumber.ToString(), difference.ToString(), statusColor); + MessageBox.Show("Image includes wrong colors", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } - - var have = legoColorService.LegoColors.Sum(l => l.HaveCount); - var needed = legoColorService.LegoColors.Sum(l => l.NeedCount); - AddLine(System.Drawing.Color.White, have.ToString(), needed.ToString(), "Total:", "", "", System.Drawing.Color.White); } private void AddLine(System.Drawing.Color color, string textHave, string textNeed, string textRgb, string textNumber, string textDifference, System.Drawing.Color statusColor) diff --git a/LegoArtTool/LegoColorInfo.cs b/LegoArtTool/LegoArtColorInfo.cs similarity index 78% rename from LegoArtTool/LegoColorInfo.cs rename to LegoArtTool/LegoArtColorInfo.cs index c27a91a..833c591 100644 --- a/LegoArtTool/LegoColorInfo.cs +++ b/LegoArtTool/LegoArtColorInfo.cs @@ -2,14 +2,14 @@ namespace LegoArtTool { - public class LegoColorInfo + public class LegoArtColorInfo { public Color Color { get; private set; } public int LegoNumber { get; private set; } public int HaveCount { get; private set; } public int NeedCount { get; set; } - public LegoColorInfo(Color color, int number, int haveCount) + public LegoArtColorInfo(Color color, int number, int haveCount) { Color = color; LegoNumber = number; diff --git a/LegoArtTool/LegoArtColorService.cs b/LegoArtTool/LegoArtColorService.cs new file mode 100644 index 0000000..6b05cd6 --- /dev/null +++ b/LegoArtTool/LegoArtColorService.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.Linq; +using System.Drawing; + +namespace LegoArtTool +{ + public class LegoArtColorService + { + public static readonly List LegoColors; + + static LegoArtColorService() + { + 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)); + } + + public List ParseImage(string imagePath) + { + var parsedLegoColors = new List(LegoColors); + + var bitmap = new Bitmap(imagePath); + var width = bitmap.Width; + var height = bitmap.Height; + for (int h = 0; h < height; h++) + { + for (int w = 0; w < width; w++) + { + var clr = bitmap.GetPixel(h, w); + var legoColorInfo = parsedLegoColors.SingleOrDefault(l => l.Color == clr); + if (legoColorInfo != null) + { + legoColorInfo.NeedCount++; + } + else + { + return null; + } + } + } + return parsedLegoColors; + } + } +} diff --git a/LegoArtTool/LegoArtTool.csproj b/LegoArtTool/LegoArtTool.csproj index cb63190..aa462e7 100644 --- a/LegoArtTool/LegoArtTool.csproj +++ b/LegoArtTool/LegoArtTool.csproj @@ -4,4 +4,8 @@ netcoreapp3.1 + + + + diff --git a/LegoArtTool/LegoColorService.cs b/LegoArtTool/LegoColorService.cs deleted file mode 100644 index 6850d9c..0000000 --- a/LegoArtTool/LegoColorService.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Drawing; - -namespace LegoArtTool -{ - public class LegoColorService - { - public List LegoColors { get; private set; } - - public LegoColorService() - { - LegoColors = new List(); - - LegoColors.Add(new LegoColorInfo(Color.FromArgb(0, 0, 0), 1, 698)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(102, 101, 96), 2, 141)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(167, 166, 162), 3, 51)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(246, 246, 248), 4, 149)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(0, 53, 94), 5, 121)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(101, 135, 162), 6, 52)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(121, 196, 236), 7, 57)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(253, 104, 0), 8, 74)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(255, 170, 0), 9, 65)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(229, 205, 135), 10, 283)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(163, 129, 93), 11, 137)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(196, 115, 54), 12, 29)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(206, 81, 0), 13, 85)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(119, 40, 0), 14, 250)); - LegoColors.Add(new LegoColorInfo(Color.FromArgb(66, 23, 3), 15, 554)); - } - - public LegoColorInfo GetColorInfo(Color color) - { - return LegoColors.Single(l => l.Color == color); - } - } -}