From 0d46d3a6f6facc07c5712344e72ba0d0d6454677 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 5 Dec 2019 13:39:08 +1100 Subject: [PATCH] Fix #1006 ResizeMode.Crop --- .../Transforms/Resize/ResizeWorker.cs | 4 +- .../Processors/Transforms/ResizeTests.cs | 51 ++++++++++++++----- tests/ImageSharp.Tests/TestImages.cs | 1 + tests/Images/External | 2 +- .../Jpg/issues/issue1006-incorrect-resize.jpg | 3 ++ 5 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 tests/Images/Input/Jpg/issues/issue1006-incorrect-resize.jpg diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs index 8461272757..52faac0cd8 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -122,7 +122,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms // Ensure offsets are normalized for cropping and padding. ResizeKernel kernel = this.verticalKernelMap.GetKernel(y - this.targetOrigin.Y); - if (kernel.StartIndex + kernel.Length > this.currentWindow.Max) + while (kernel.StartIndex + kernel.Length > this.currentWindow.Max) { this.Slide(); } diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index 43384aee7c..6171c3c695 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -135,7 +135,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms destSize.Height, image0.Height, Configuration.Default.MemoryAllocator); - int minimumWorkerAllocationInBytes = verticalKernelMap.MaxDiameter * 2 * destSize.Width * SizeOfVector4; + int minimumWorkerAllocationInBytes = verticalKernelMap.MaxDiameter * 2 * destSize.Width * SizeOfVector4; verticalKernelMap.Dispose(); using (Image image = image0.Clone(configuration)) @@ -419,9 +419,10 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms using (Image image = provider.GetImage()) { var options = new ResizeOptions - { - Size = new Size(image.Width + 200, image.Height + 200), Mode = ResizeMode.BoxPad - }; + { + Size = new Size(image.Width + 200, image.Height + 200), + Mode = ResizeMode.BoxPad + }; image.Mutate(x => x.Resize(options)); @@ -462,6 +463,26 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } } + [Theory] + [WithFile(TestImages.Jpeg.Issues.IncorrectResize1006, DefaultPixelType)] + public void CanResizeLargeImageWithCropMode(TestImageProvider provider) + where TPixel : struct, IPixel + { + using (Image image = provider.GetImage()) + { + var options = new ResizeOptions + { + Size = new Size(480, 600), + Mode = ResizeMode.Crop + }; + + image.Mutate(x => x.Resize(options)); + + image.DebugSave(provider); + image.CompareToReferenceOutput(ValidatorComparer, provider); + } + } + [Theory] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void ResizeWithMaxMode(TestImageProvider provider) @@ -486,12 +507,12 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms using (Image image = provider.GetImage()) { var options = new ResizeOptions - { - Size = new Size( + { + Size = new Size( (int)Math.Round(image.Width * .75F), (int)Math.Round(image.Height * .95F)), - Mode = ResizeMode.Min - }; + Mode = ResizeMode.Min + }; image.Mutate(x => x.Resize(options)); @@ -508,9 +529,10 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms using (Image image = provider.GetImage()) { var options = new ResizeOptions - { - Size = new Size(image.Width + 200, image.Height), Mode = ResizeMode.Pad - }; + { + Size = new Size(image.Width + 200, image.Height), + Mode = ResizeMode.Pad + }; image.Mutate(x => x.Resize(options)); @@ -527,9 +549,10 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms using (Image image = provider.GetImage()) { var options = new ResizeOptions - { - Size = new Size(image.Width / 2, image.Height), Mode = ResizeMode.Stretch - }; + { + Size = new Size(image.Width / 2, image.Height), + Mode = ResizeMode.Stretch + }; image.Mutate(x => x.Resize(options)); diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index d19dbe8341..8f1eca4829 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -190,6 +190,7 @@ namespace SixLabors.ImageSharp.Tests public const string ExifGetString750Load = "Jpg/issues/issue750-exif-load.jpg"; public const string IncorrectQuality845 = "Jpg/issues/Issue845-Incorrect-Quality99.jpg"; public const string IncorrectColorspace855 = "Jpg/issues/issue855-incorrect-colorspace.jpg"; + public const string IncorrectResize1006 = "Jpg/issues/issue1006-incorrect-resize.jpg"; public static class Fuzz { diff --git a/tests/Images/External b/tests/Images/External index ca4cf8318f..d7c099cebd 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit ca4cf8318fe4d09f0fc825686dcd477ebfb5e3e5 +Subproject commit d7c099cebd58f1d3ff997383351d52d28a29df3d diff --git a/tests/Images/Input/Jpg/issues/issue1006-incorrect-resize.jpg b/tests/Images/Input/Jpg/issues/issue1006-incorrect-resize.jpg new file mode 100644 index 0000000000..3880b869ed --- /dev/null +++ b/tests/Images/Input/Jpg/issues/issue1006-incorrect-resize.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90079722b2763f64ff7a47889a7775c9b63ed92239aeff4df437bd1b5a5ab540 +size 618142