Update ImageReader to reaad images without resizinf
This commit is contained in:
@@ -5,7 +5,7 @@ namespace Toolkit.Avalonia;
|
|||||||
public interface IImageResizer
|
public interface IImageResizer
|
||||||
{
|
{
|
||||||
public Bitmap Resize(Stream stream,
|
public Bitmap Resize(Stream stream,
|
||||||
int targetWidth,
|
double width,
|
||||||
int targetHeight,
|
double height,
|
||||||
bool maintainAspectRatio);
|
bool maintainAspectRatio);
|
||||||
}
|
}
|
||||||
@@ -7,11 +7,23 @@ public class ImageReader(IImageResizer imageResizer) :
|
|||||||
IImageReader
|
IImageReader
|
||||||
{
|
{
|
||||||
public IImageDescriptor Get(Stream stream,
|
public IImageDescriptor Get(Stream stream,
|
||||||
int width,
|
double width,
|
||||||
int height,
|
double height,
|
||||||
bool maintainAspectRatio)
|
bool maintainAspectRatio)
|
||||||
{
|
{
|
||||||
Bitmap resizedImage = imageResizer.Resize(stream, width, height, maintainAspectRatio);
|
Bitmap resizedImage = imageResizer.Resize(stream,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
maintainAspectRatio);
|
||||||
|
|
||||||
return new ImageDescriptor(resizedImage, width, height);
|
return new ImageDescriptor(resizedImage, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IImageDescriptor Get(Stream stream)
|
||||||
|
{
|
||||||
|
Bitmap image = new(stream);
|
||||||
|
return new ImageDescriptor(image,
|
||||||
|
image.Size.Width,
|
||||||
|
image.Size.Height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,29 +7,29 @@ public class ImageResizer :
|
|||||||
IImageResizer
|
IImageResizer
|
||||||
{
|
{
|
||||||
public Bitmap Resize(Stream stream,
|
public Bitmap Resize(Stream stream,
|
||||||
int targetWidth,
|
double width,
|
||||||
int targetHeight,
|
double height,
|
||||||
bool maintainAspectRatio)
|
bool maintainAspectRatio)
|
||||||
{
|
{
|
||||||
Bitmap bitmap = new(stream);
|
Bitmap bitmap = new(stream);
|
||||||
|
|
||||||
if (bitmap.Size.Width != targetWidth || bitmap.Size.Height != targetHeight)
|
if (bitmap.Size.Width != width || bitmap.Size.Height != height)
|
||||||
{
|
{
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
stream.Seek(0, SeekOrigin.Begin);
|
||||||
using SKBitmap sKBitmap = SKBitmap.Decode(stream);
|
using SKBitmap sKBitmap = SKBitmap.Decode(stream);
|
||||||
|
|
||||||
if (targetHeight == 0 && maintainAspectRatio)
|
if (height == 0 && maintainAspectRatio)
|
||||||
{
|
{
|
||||||
targetHeight = (int)((float)targetWidth / sKBitmap.Width * sKBitmap.Height);
|
height = (int)((float)width / sKBitmap.Width * sKBitmap.Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (targetWidth == 0 && maintainAspectRatio)
|
if (width == 0 && maintainAspectRatio)
|
||||||
{
|
{
|
||||||
targetWidth = (int)((float)targetHeight / sKBitmap.Height * sKBitmap.Width);
|
width = (int)((float)height / sKBitmap.Height * sKBitmap.Width);
|
||||||
}
|
}
|
||||||
|
|
||||||
float widthRatio = (float)targetWidth / sKBitmap.Width;
|
float widthRatio = (float)width / sKBitmap.Width;
|
||||||
float heightRatio = (float)targetHeight / sKBitmap.Height;
|
float heightRatio = (float)height / sKBitmap.Height;
|
||||||
float scale = maintainAspectRatio ? Math.Max(widthRatio, heightRatio) : Math.Min(widthRatio, heightRatio);
|
float scale = maintainAspectRatio ? Math.Max(widthRatio, heightRatio) : Math.Min(widthRatio, heightRatio);
|
||||||
|
|
||||||
int newWidth = (int)(sKBitmap.Width * scale);
|
int newWidth = (int)(sKBitmap.Width * scale);
|
||||||
@@ -50,14 +50,14 @@ public class ImageResizer :
|
|||||||
SKBitmap cropped;
|
SKBitmap cropped;
|
||||||
if (maintainAspectRatio)
|
if (maintainAspectRatio)
|
||||||
{
|
{
|
||||||
int cropX = (newWidth - targetWidth) / 2;
|
int cropX = (int)(newWidth - width) / 2;
|
||||||
int cropY = (newHeight - targetHeight) / 2;
|
int cropY = (int)(newHeight - height) / 2;
|
||||||
|
|
||||||
cropped = new SKBitmap(targetWidth, targetHeight);
|
cropped = new SKBitmap((int)width, (int)height);
|
||||||
using SKCanvas croppedCanvas = new(cropped);
|
using SKCanvas croppedCanvas = new(cropped);
|
||||||
SKRect cropRect = new(cropX, cropY, cropX + targetWidth, cropY + targetHeight);
|
SKRect cropRect = new(cropX, cropY, (int)(cropX + width), cropY + (int)height);
|
||||||
croppedCanvas.Clear(SKColors.Transparent);
|
croppedCanvas.Clear(SKColors.Transparent);
|
||||||
croppedCanvas.DrawBitmap(resized, cropRect, new SKRect(0, 0, targetWidth, targetHeight));
|
croppedCanvas.DrawBitmap(resized, cropRect, new SKRect(0, 0, (int)width, (int)height));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ public interface IImageDescriptor
|
|||||||
{
|
{
|
||||||
object Image { get; }
|
object Image { get; }
|
||||||
|
|
||||||
int Width { get; }
|
double Width { get; }
|
||||||
|
|
||||||
int Height { get; }
|
double Height { get; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
public interface IImageReader
|
public interface IImageReader
|
||||||
{
|
{
|
||||||
IImageDescriptor Get(Stream stream,
|
IImageDescriptor Get(Stream stream,
|
||||||
int width,
|
double width,
|
||||||
int height,
|
double height,
|
||||||
bool maintainAspectRatio = false);
|
bool maintainAspectRatio = false);
|
||||||
|
|
||||||
|
IImageDescriptor Get(Stream stream);
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Toolkit.Foundation;
|
namespace Toolkit.Foundation;
|
||||||
|
|
||||||
public record ImageDescriptor(object Image, int Width, int Height) :
|
public record ImageDescriptor(object Image, double Width, double Height) :
|
||||||
IImageDescriptor;
|
IImageDescriptor;
|
||||||
Reference in New Issue
Block a user