79 lines
2.6 KiB
C#
79 lines
2.6 KiB
C#
using Avalonia.Media.Imaging;
|
|
using SkiaSharp;
|
|
|
|
namespace Toolkit.Avalonia;
|
|
|
|
public class ImageResizer :
|
|
IImageResizer
|
|
{
|
|
public Bitmap Resize(Stream stream,
|
|
double width,
|
|
double height,
|
|
bool maintainAspectRatio)
|
|
{
|
|
Bitmap bitmap = new(stream);
|
|
|
|
if (bitmap.Size.Width != width || bitmap.Size.Height != height)
|
|
{
|
|
stream.Seek(0, SeekOrigin.Begin);
|
|
using SKBitmap sKBitmap = SKBitmap.Decode(stream);
|
|
|
|
if (height == 0 && maintainAspectRatio)
|
|
{
|
|
height = (int)((float)width / sKBitmap.Width * sKBitmap.Height);
|
|
}
|
|
|
|
if (width == 0 && maintainAspectRatio)
|
|
{
|
|
width = (int)((float)height / sKBitmap.Height * sKBitmap.Width);
|
|
}
|
|
|
|
float widthRatio = (float)width / sKBitmap.Width;
|
|
float heightRatio = (float)height / sKBitmap.Height;
|
|
float scale = maintainAspectRatio ? Math.Max(widthRatio, heightRatio) : Math.Min(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);
|
|
|
|
using SKPaint paint = new()
|
|
{
|
|
FilterQuality = SKFilterQuality.High,
|
|
IsAntialias = true
|
|
};
|
|
|
|
canvas.Clear(SKColors.Transparent);
|
|
canvas.DrawBitmap(sKBitmap, new SKRect(0, 0, newWidth, newHeight), paint);
|
|
|
|
SKBitmap cropped;
|
|
if (maintainAspectRatio)
|
|
{
|
|
int cropX = (int)(newWidth - width) / 2;
|
|
int cropY = (int)(newHeight - height) / 2;
|
|
|
|
cropped = new SKBitmap((int)width, (int)height);
|
|
using SKCanvas croppedCanvas = new(cropped);
|
|
SKRect cropRect = new(cropX, cropY, (int)(cropX + width), cropY + (int)height);
|
|
croppedCanvas.Clear(SKColors.Transparent);
|
|
croppedCanvas.DrawBitmap(resized, cropRect, new SKRect(0, 0, (int)width, (int)height));
|
|
}
|
|
else
|
|
{
|
|
cropped = resized;
|
|
}
|
|
|
|
using SKImage image = SKImage.FromBitmap(cropped);
|
|
using MemoryStream outputStream = new();
|
|
image.Encode(SKEncodedImageFormat.Png, 100).SaveTo(outputStream);
|
|
outputStream.Seek(0, SeekOrigin.Begin);
|
|
bitmap.Dispose();
|
|
|
|
return new Bitmap(outputStream);
|
|
}
|
|
|
|
return bitmap;
|
|
}
|
|
|
|
} |