From 8912d0e890276a94591bef3f735cb7ca251806ef Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 14 Aug 2017 03:22:26 +0200 Subject: [PATCH] reduced resize output by 75% --- .../Processing/Transforms/Resize.cs | 16 +++ .../Processors/Transforms/ResizeTests.cs | 110 ++++++++++-------- 2 files changed, 80 insertions(+), 46 deletions(-) diff --git a/src/ImageSharp/Processing/Transforms/Resize.cs b/src/ImageSharp/Processing/Transforms/Resize.cs index 38662317b..c1599ebe2 100644 --- a/src/ImageSharp/Processing/Transforms/Resize.cs +++ b/src/ImageSharp/Processing/Transforms/Resize.cs @@ -123,6 +123,22 @@ namespace ImageSharp return Resize(source, width, height, sampler, false); } + /// + /// Resizes an image to the given width and height with the given sampler. + /// + /// The pixel format. + /// The image to resize. + /// The target image size. + /// 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 + public static IImageProcessingContext Resize(this IImageProcessingContext source, Size size, IResampler sampler, bool compand) + where TPixel : struct, IPixel + { + return Resize(source, size.Width, size.Height, sampler, new Rectangle(0, 0, size.Width, size.Height), compand); + } + /// /// Resizes an image to the given width and height with the given sampler. /// diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index db8063ba3..0fc424295 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Tests.Processing.Processors.Transforms { public static readonly string[] ResizeFiles = { TestImages.Png.CalliphoraPartial }; - public static readonly TheoryData ReSamplers = + public static readonly TheoryData AllReSamplers = new TheoryData { { "Bicubic", new BicubicResampler() }, @@ -32,6 +32,12 @@ namespace ImageSharp.Tests.Processing.Processors.Transforms { "Welch", new WelchResampler() } }; + public static readonly TheoryData JustBicubicResampler = + new TheoryData + { + { "Bicubic", new BicubicResampler() }, + }; + [Theory] [WithFile(TestImages.Gif.Giphy, DefaultPixelType)] public void ResizeShouldApplyToAllFrames(TestImageProvider provider) @@ -45,21 +51,40 @@ namespace ImageSharp.Tests.Processing.Processors.Transforms } [Theory] - [WithTestPatternImages(nameof(ReSamplers), 100, 100, DefaultPixelType)] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResize(TestImageProvider provider, string name, IResampler sampler) + [WithTestPatternImages(nameof(AllReSamplers), 100, 100, DefaultPixelType, 50)] + [WithFileCollection(nameof(ResizeFiles), nameof(AllReSamplers), DefaultPixelType, 50)] + [WithFileCollection(nameof(ResizeFiles), nameof(AllReSamplers), DefaultPixelType, 30)] + public void ResizeFullImage(TestImageProvider provider, string name, IResampler sampler, int percents) + where TPixel : struct, IPixel + { + using (Image image = provider.GetImage()) + { + float ratio = (float)percents / 100.0F; + SizeF newSize = image.Size() * ratio; + image.Mutate(x => x.Resize((Size)newSize, sampler, false)); + + string details = $"{name}-{percents}%"; + + image.DebugSave(provider, details); + } + } + + [Theory] + [WithTestPatternImages(100, 100, DefaultPixelType)] + public void ResizeFullImage_Compand(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { - image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2, sampler, true)); - image.DebugSave(provider, name); + image.Mutate(x => x.Resize(image.Size() / 2, true)); + + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeFromSourceRectangle(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeFromSourceRectangle(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) @@ -67,163 +92,156 @@ namespace ImageSharp.Tests.Processing.Processors.Transforms var sourceRectangle = new Rectangle(image.Width / 8, image.Height / 8, image.Width / 4, image.Height / 4); var destRectangle = new Rectangle(image.Width / 4, image.Height / 4, image.Width / 2, image.Height / 2); - image.Mutate(x => x.Resize(image.Width, image.Height, sampler, sourceRectangle, destRectangle, false)); - image.DebugSave(provider, name); + image.Mutate(x => x.Resize(image.Width, image.Height, new BicubicResampler(), sourceRectangle, destRectangle, false)); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWidthAndKeepAspect(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWidthAndKeepAspect(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { - image.Mutate(x => x.Resize(image.Width / 3, 0, sampler, false)); - image.DebugSave(provider, name); + image.Mutate(x => x.Resize(image.Width / 3, 0, false)); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeHeightAndKeepAspect(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeHeightAndKeepAspect(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { - image.Mutate(x => x.Resize(0, image.Height / 3, sampler, false)); - image.DebugSave(provider, name); + image.Mutate(x => x.Resize(0, image.Height / 3, false)); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWithCropWidthMode(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWithCropWidthMode(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { var options = new ResizeOptions { - Sampler = sampler, Size = new Size(image.Width / 2, image.Height) }; image.Mutate(x => x.Resize(options)); - image.DebugSave(provider, name); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWithCropHeightMode(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWithCropHeightMode(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { var options = new ResizeOptions { - Sampler = sampler, Size = new Size(image.Width, image.Height / 2) }; image.Mutate(x => x.Resize(options)); - image.DebugSave(provider, name); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWithPadMode(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWithPadMode(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { var options = new ResizeOptions { - Sampler = sampler, Size = new Size(image.Width + 200, image.Height), Mode = ResizeMode.Pad }; image.Mutate(x => x.Resize(options)); - image.DebugSave(provider, name); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWithBoxPadMode(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWithBoxPadMode(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { var options = new ResizeOptions { - Sampler = sampler, Size = new Size(image.Width + 200, image.Height + 200), Mode = ResizeMode.BoxPad }; image.Mutate(x => x.Resize(options)); - image.DebugSave(provider, name); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWithMaxMode(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWithMaxMode(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { var options = new ResizeOptions { - Sampler = sampler, Size = new Size(300, 300), Mode = ResizeMode.Max }; image.Mutate(x => x.Resize(options)); - image.DebugSave(provider, name); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWithMinMode(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWithMinMode(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { var options = new ResizeOptions { - Sampler = sampler, Size = new Size((int)MathF.Round(image.Width * .75F), (int)MathF.Round(image.Height * .95F)), Mode = ResizeMode.Min }; image.Mutate(x => x.Resize(options)); - image.DebugSave(provider, name); + image.DebugSave(provider); } } [Theory] - [WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), DefaultPixelType)] - public void ImageShouldResizeWithStretchMode(TestImageProvider provider, string name, IResampler sampler) + [WithFileCollection(nameof(ResizeFiles), DefaultPixelType)] + public void ImageShouldResizeWithStretchMode(TestImageProvider provider) where TPixel : struct, IPixel { using (Image image = provider.GetImage()) { var options = new ResizeOptions { - Sampler = sampler, Size = new Size(image.Width / 2, image.Height), Mode = ResizeMode.Stretch }; image.Mutate(x => x.Resize(options)); - image.DebugSave(provider, name); + image.DebugSave(provider); } }