diff --git a/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs
index 2f1ef68652..53cd9e9d3e 100644
--- a/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs
@@ -45,7 +45,21 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
// Ensure size is populated across both dimensions.
// These dimensions are used to calculate the final dimensions determined by the mode algorithm.
- EnsureSizeBothDimensions(sourceSize.Width, sourceSize.Height, ref targetWidth, ref targetHeight, out _, out _);
+ // If only one of the incoming dimensions is 0, it will be modified here to maintain aspect ratio.
+ // If it is not possible to keep aspect ratio, make sure at least the minimum is is kept.
+ const int min = 1;
+ if (targetWidth == 0 && targetHeight > 0)
+ {
+ targetWidth = (int)MathF.Max(min, MathF.Round(sourceSize.Width * targetHeight / (float)sourceSize.Height));
+ }
+
+ if (targetHeight == 0 && targetWidth > 0)
+ {
+ targetHeight = (int)MathF.Max(min, MathF.Round(sourceSize.Height * targetWidth / (float)sourceSize.Width));
+ }
+
+ Guard.MustBeGreaterThan(targetWidth, 0, nameof(targetWidth));
+ Guard.MustBeGreaterThan(targetHeight, 0, nameof(targetHeight));
(Size size, Rectangle rectangle) = ResizeHelper.CalculateTargetLocationAndBounds(sourceSize, options, targetWidth, targetHeight);
@@ -84,14 +98,18 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
Guard.NotNull(sampler, nameof(sampler));
// Ensure size is populated across both dimensions.
- EnsureSizeBothDimensions(sourceSize.Width, sourceSize.Height, ref width, ref height, out bool changedWidth, out bool changedHeight);
- if (changedWidth)
+ // If only one of the incoming dimensions is 0, it will be modified here to maintain aspect ratio.
+ // If it is not possible to keep aspect ratio, make sure at least the minimum is is kept.
+ const int min = 1;
+ if (width == 0 && height > 0)
{
+ width = (int)MathF.Max(min, MathF.Round(sourceSize.Width * height / (float)sourceSize.Height));
resizeRectangle.Width = width;
}
- if (changedHeight)
+ if (height == 0 && width > 0)
{
+ height = (int)MathF.Max(min, MathF.Round(sourceSize.Height * width / (float)sourceSize.Width));
resizeRectangle.Height = height;
}
@@ -130,43 +148,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
///
public bool Compand { get; }
- ///
- /// Makes sure both target dimensions are >= 1.
- /// If only one of the incoming dimensions is 0, it will be modified here to maintain aspect ratio.
- /// If it is not possible to keep aspect ratio, make sure at least 1 pixel is kept.
- ///
- private static void EnsureSizeBothDimensions(
- int sourceWidth,
- int sourceHeight,
- ref int targetWidth,
- ref int targetHeight,
- out bool changedTargetWidth,
- out bool changedTargetHeight)
- {
- if (targetWidth == 0 && targetHeight > 0)
- {
- targetWidth = Math.Max(1, (int)MathF.Round(sourceWidth * targetHeight / (float)sourceHeight));
- changedTargetWidth = true;
- }
- else
- {
- changedTargetWidth = false;
- }
-
- if (targetHeight == 0 && targetWidth > 0)
- {
- targetHeight = Math.Max(1, (int)MathF.Round(sourceHeight * targetWidth / (float)sourceWidth));
- changedTargetHeight = true;
- }
- else
- {
- changedTargetHeight = false;
- }
-
- Guard.MustBeGreaterThan(targetWidth, 0, nameof(targetWidth));
- Guard.MustBeGreaterThan(targetHeight, 0, nameof(targetHeight));
- }
-
///
/// Computes the weights to apply at each pixel when resizing.
///
diff --git a/src/ImageSharp/Processing/ResizeExtensions.cs b/src/ImageSharp/Processing/ResizeExtensions.cs
index 8a370db693..7b6c14d7de 100644
--- a/src/ImageSharp/Processing/ResizeExtensions.cs
+++ b/src/ImageSharp/Processing/ResizeExtensions.cs
@@ -19,7 +19,7 @@ namespace SixLabors.ImageSharp.Processing
/// The image to resize.
/// The resize options.
/// The
- /// Passing zero for one of height or width within the resize options will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width within the resize options will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, ResizeOptions options)
where TPixel : struct, IPixel
=> source.ApplyProcessor(new ResizeProcessor(options, source.GetCurrentSize()));
@@ -31,7 +31,7 @@ namespace SixLabors.ImageSharp.Processing
/// The image to resize.
/// The target image size.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, Size size)
where TPixel : struct, IPixel
=> Resize(source, size.Width, size.Height, KnownResamplers.Bicubic, false);
@@ -44,7 +44,7 @@ namespace SixLabors.ImageSharp.Processing
/// The target image size.
/// Whether to compress and expand the image color-space to gamma correct the image during processing.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, Size size, bool compand)
where TPixel : struct, IPixel
=> Resize(source, size.Width, size.Height, KnownResamplers.Bicubic, compand);
@@ -57,7 +57,7 @@ namespace SixLabors.ImageSharp.Processing
/// The target image width.
/// The target image height.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, int width, int height)
where TPixel : struct, IPixel
=> Resize(source, width, height, KnownResamplers.Bicubic, false);
@@ -71,7 +71,7 @@ namespace SixLabors.ImageSharp.Processing
/// The target image height.
/// Whether to compress and expand the image color-space to gamma correct the image during processing.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, int width, int height, bool compand)
where TPixel : struct, IPixel
=> Resize(source, width, height, KnownResamplers.Bicubic, compand);
@@ -85,7 +85,7 @@ namespace SixLabors.ImageSharp.Processing
/// The target image height.
/// The to perform the resampling.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, int width, int height, IResampler sampler)
where TPixel : struct, IPixel
=> Resize(source, width, height, sampler, false);
@@ -99,7 +99,7 @@ namespace SixLabors.ImageSharp.Processing
/// The to perform the resampling.
/// Whether to compress and expand the image color-space to gamma correct the image during processing.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, Size size, IResampler sampler, bool compand)
where TPixel : struct, IPixel
=> Resize(source, size.Width, size.Height, sampler, new Rectangle(0, 0, size.Width, size.Height), compand);
@@ -114,7 +114,7 @@ namespace SixLabors.ImageSharp.Processing
/// The to perform the resampling.
/// Whether to compress and expand the image color-space to gamma correct the image during processing.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(this IImageProcessingContext source, int width, int height, IResampler sampler, bool compand)
where TPixel : struct, IPixel
=> Resize(source, width, height, sampler, new Rectangle(0, 0, width, height), compand);
@@ -136,7 +136,7 @@ namespace SixLabors.ImageSharp.Processing
///
/// Whether to compress and expand the image color-space to gamma correct the image during processing.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(
this IImageProcessingContext source,
int width,
@@ -161,7 +161,7 @@ namespace SixLabors.ImageSharp.Processing
///
/// Whether to compress and expand the image color-space to gamma correct the image during processing.
/// The
- /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image
+ /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image or the nearest possible ratio.
public static IImageProcessingContext Resize(
this IImageProcessingContext source,
int width,