From 8270bda7879ce9854afe5e8a36feb7b08e857d13 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Wed, 3 Jul 2024 09:15:37 +0100 Subject: [PATCH] Fixed a bug where we if the bitmap needs resizing and cropping, we need to seek the stream back to the begining --- Toolkit.Avalonia/ImageResizer.cs | 40 +++++++++++++------------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/Toolkit.Avalonia/ImageResizer.cs b/Toolkit.Avalonia/ImageResizer.cs index fbfcfdd..0a83456 100644 --- a/Toolkit.Avalonia/ImageResizer.cs +++ b/Toolkit.Avalonia/ImageResizer.cs @@ -6,52 +6,44 @@ namespace Toolkit.Avalonia; public class ImageResizer : IImageResizer { - public Bitmap Resize(Stream stream, - int targetWidth, - int targetHeight, - bool maintainAspectRatio) + public Bitmap Resize(Stream stream, int targetWidth, int targetHeight, bool maintainAspectRatio) { Bitmap bitmap = new(stream); if (bitmap.Size.Width != targetWidth || bitmap.Size.Height != targetHeight) { - using SKBitmap sKBitmap = SKBitmap.Decode(stream); - SKBitmap? cropped = null; - bitmap.Dispose(); + stream.Seek(0, SeekOrigin.Begin); + using SKBitmap sKBitmap = SKBitmap.Decode(stream); float widthRatio = (float)targetWidth / sKBitmap.Width; float heightRatio = (float)targetHeight / sKBitmap.Height; - float scale = maintainAspectRatio ? Math.Max(widthRatio, heightRatio) : Math.Min(widthRatio, heightRatio); + float scale = maintainAspectRatio ? Math.Min(widthRatio, heightRatio) : Math.Max(widthRatio, heightRatio); int newWidth = (int)(sKBitmap.Width * scale); int newHeight = (int)(sKBitmap.Height * scale); - using SKBitmap resized = new(newWidth, newHeight); - using SKCanvas canvas = new(resized); - - canvas.Clear(SKColors.Transparent); - canvas.DrawBitmap(sKBitmap, new SKRect(0, 0, newWidth, newHeight)); + using SKBitmap resized = sKBitmap.Resize(new SKImageInfo(newWidth, newHeight), SKFilterQuality.High); + SKBitmap cropped = resized; if (maintainAspectRatio) { - int cropX = (newWidth - targetWidth) / 2; - int cropY = (newHeight - targetHeight) / 2; + int cropX = (resized.Width - targetWidth) / 2; + int cropY = (resized.Height - targetHeight) / 2; cropped = new SKBitmap(targetWidth, targetHeight); - using SKCanvas croppedCanvas = new(cropped); - SKRect cropRect = new(cropX, cropY, cropX + targetWidth, cropY + targetHeight); - croppedCanvas.Clear(SKColors.Transparent); - croppedCanvas.DrawBitmap(resized, cropRect, new SKRect(0, 0, targetWidth, targetHeight)); - } - else - { - cropped = resized; + using (SKCanvas croppedCanvas = new(cropped)) + { + SKRect srcRect = new(cropX, cropY, cropX + targetWidth, cropY + targetHeight); + SKRect destRect = new(0, 0, targetWidth, targetHeight); + croppedCanvas.DrawBitmap(resized, srcRect, destRect); + } } using SKImage image = SKImage.FromBitmap(cropped); - using MemoryStream outputStream = new(); + using MemoryStream outputStream = new MemoryStream(); image.Encode(SKEncodedImageFormat.Png, 100).SaveTo(outputStream); outputStream.Seek(0, SeekOrigin.Begin); + bitmap.Dispose(); return new Bitmap(outputStream); }