Scale bitmap

This commit is contained in:
Claudio Schaad 2020-11-29 15:20:37 +01:00
parent bd78a130ea
commit 74b4ad83e3
4 changed files with 97 additions and 11 deletions

View file

@ -0,0 +1,39 @@
using System;
using System.IO;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace LegoArt
{
public class ImageHelperService
{
public BitmapImage LoadToImage(System.Drawing.Bitmap bitmap)
{
using (var memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;
var bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.StreamSource = memory;
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.EndInit();
return bitmapimage;
}
}
public BitmapImage LoadToImage(string path)
{
var bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.UriSource = new Uri(path);
bitmapimage.EndInit();
return bitmapimage;
}
public Color ConvertDrawingToWindowsMediaColor(System.Drawing.Color inputColor)
{
return Color.FromArgb(inputColor.A, inputColor.R, inputColor.G, inputColor.B);
}
}
}

View file

@ -5,13 +5,17 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LegoArt" xmlns:local="clr-namespace:LegoArt"
mc:Ignorable="d" mc:Ignorable="d"
Title="Lego Art Color Info" Height="500" Width="420"> Title="Lego Art Color Info" Height="500" Width="800">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="25"/> <RowDefinition Height="25"/>
<RowDefinition Height="20"/> <RowDefinition Height="20"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</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="50" Content="Bild:"/>
@ -20,7 +24,12 @@
</StackPanel> </StackPanel>
<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">
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="sourceImage" Stretch="None"/>
<Image HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Name="scaledImage" Stretch="None"/>
</StackPanel>
</Grid> </Grid>
</Window> </Window>

View file

@ -13,9 +13,17 @@ namespace LegoArt
/// </summary> /// </summary>
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
private readonly LegoArtColorService legoArtColorService;
private readonly BitmapHelperService bitmapHelperService;
private readonly ImageHelperService imageHelperService;
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
legoArtColorService = new LegoArtColorService();
bitmapHelperService = new BitmapHelperService();
imageHelperService = new ImageHelperService();
} }
private void btnImageChooser_Click(object sender, RoutedEventArgs e) private void btnImageChooser_Click(object sender, RoutedEventArgs e)
@ -30,10 +38,15 @@ namespace LegoArt
private void LoadImage(string path) private void LoadImage(string path)
{ {
var legoArtColorService = new LegoArtColorService();
var legoArtColors = legoArtColorService.ParseImage(path); var legoArtColors = legoArtColorService.ParseImage(path);
if (legoArtColors != null) if (legoArtColors != null)
{ {
var sourceBitamp = bitmapHelperService.ScaleImage(path, 1);
sourceImage.Source = imageHelperService.LoadToImage(sourceBitamp);
var scaledBitamp = bitmapHelperService.ScaleImage(path, 5);
scaledImage.Source = imageHelperService.LoadToImage(scaledBitamp);
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);
@ -60,7 +73,7 @@ namespace LegoArt
private void AddLine(System.Drawing.Color color, string textHave, string textNeed, string textRgb, string textNumber, string textDifference, System.Drawing.Color statusColor) private void AddLine(System.Drawing.Color color, string textHave, string textNeed, string textRgb, string textNumber, string textDifference, System.Drawing.Color statusColor)
{ {
var displayColor = ConvertDrawingToWindowsMediaColor(color); var displayColor = imageHelperService.ConvertDrawingToWindowsMediaColor(color);
var rect = new Rectangle(); var rect = new Rectangle();
rect.Width = 20; rect.Width = 20;
rect.Height = 20; rect.Height = 20;
@ -96,7 +109,7 @@ namespace LegoArt
differenceTextBlock.TextAlignment = TextAlignment.Center; differenceTextBlock.TextAlignment = TextAlignment.Center;
differenceTextBlock.Text = textDifference; differenceTextBlock.Text = textDifference;
var displayStatusColor = ConvertDrawingToWindowsMediaColor(statusColor); var displayStatusColor = imageHelperService.ConvertDrawingToWindowsMediaColor(statusColor);
var status = new Rectangle(); var status = new Rectangle();
status.Width = 20; status.Width = 20;
status.Height = 20; status.Height = 20;
@ -114,10 +127,5 @@ namespace LegoArt
stackPanel.Children.Add(status); stackPanel.Children.Add(status);
parentStackPanel.Children.Add(stackPanel); parentStackPanel.Children.Add(stackPanel);
} }
private Color ConvertDrawingToWindowsMediaColor(System.Drawing.Color inputColor)
{
return Color.FromArgb(inputColor.A, inputColor.R, inputColor.G, inputColor.B);
}
} }
} }

View file

@ -0,0 +1,30 @@
using System.Drawing;
namespace LegoArtTool
{
public class BitmapHelperService
{
public Bitmap ScaleImage(string path, int scaleFactor)
{
var inputBitmap = new Bitmap(path);
var scaledBitmap = new Bitmap(inputBitmap.Width * scaleFactor, inputBitmap.Height * scaleFactor);
for (int x = 0; x < inputBitmap.Width; x++)
{
for (int y = 0; y < inputBitmap.Height; y++)
{
var sourcePixel = inputBitmap.GetPixel(x, y);
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()));
}
}
}
}
return scaledBitmap;
}
}
}