From 5c12546100ea4d97dccff3373416b695ad83021e Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 21 Jan 2018 03:34:21 +0100 Subject: [PATCH] finalized transform with source rectangle + tests --- .../Processing/Transforms/Transform.cs | 11 ++-- .../Transforms/AffineTransformTests.cs | 52 ++++++++++++++----- tests/Images/External | 2 +- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/ImageSharp/Processing/Transforms/Transform.cs b/src/ImageSharp/Processing/Transforms/Transform.cs index 87c7306b81..496e57defc 100644 --- a/src/ImageSharp/Processing/Transforms/Transform.cs +++ b/src/ImageSharp/Processing/Transforms/Transform.cs @@ -35,7 +35,7 @@ namespace SixLabors.ImageSharp /// The public static IImageProcessingContext Transform(this IImageProcessingContext source, Matrix3x2 matrix, IResampler sampler) where TPixel : struct, IPixel - => Transform(source, matrix, sampler, Rectangle.Empty); + => Transform(source, matrix, sampler, Size.Empty); /// /// Transforms an image by the given matrix using the specified sampling algorithm. @@ -44,17 +44,18 @@ namespace SixLabors.ImageSharp /// The image to transform. /// The transformation matrix. /// The to perform the resampling. - /// The rectangle to constrain the transformed image to. + /// The rectangle defining the source pixel area to transform. 'sourceRectangle.Location' becomes the origo of the transformed image. /// The public static IImageProcessingContext Transform( this IImageProcessingContext source, Matrix3x2 matrix, IResampler sampler, - Rectangle rectangle) + Rectangle sourceRectangle) where TPixel : struct, IPixel { - // TODO: Fixme! - return source.ApplyProcessor(new AffineTransformProcessor(matrix, sampler, rectangle.Size)); + var t = Matrix3x2.CreateTranslation(-sourceRectangle.Location); + Matrix3x2 combinedMatrix = t * matrix; + return source.ApplyProcessor(new AffineTransformProcessor(combinedMatrix, sampler, sourceRectangle.Size)); } /// diff --git a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs index f6ef365e54..ace6cb70d6 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs @@ -143,40 +143,66 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms { 0, 0, 5, 10 }, { 0, 0, 10, 5 }, { 5, 0, 5, 10 }, - {-5,-5, 15, 15 } + {-5,-5, 20, 20 } }; + /// + /// Testing transforms using custom source rectangles: + /// https://github.com/SixLabors/ImageSharp/pull/386#issuecomment-357104963 + /// + [Theory] + [WithTestPatternImages(96, 48, PixelTypes.Rgba32)] + public void Transform_FromSourceRectangle1(TestImageProvider provider) + where TPixel : struct, IPixel + { + var rectangle = new Rectangle(48, 0, 96, 36); + + using (Image image = provider.GetImage()) + { + var m = Matrix3x2.CreateScale(2.0F, 1.5F); + + image.Mutate(i => i.Transform(m, KnownResamplers.Spline, rectangle)); + + image.DebugSave(provider); + image.CompareToReferenceOutput(provider); + } + } + [Theory] - [WithSolidFilledImages(nameof(Transform_IntoRectangle_Data), 10, 10, nameof(Rgba32.Red), PixelTypes.Rgba32)] - public void Transform_IntoRectangle(TestImageProvider provider, int x0, int y0, int w, int h) + [WithTestPatternImages(96, 48, PixelTypes.Rgba32)] + public void Transform_FromSourceRectangle2(TestImageProvider provider) where TPixel : struct, IPixel { - var rectangle = new Rectangle(x0, y0, w, h); + var rectangle = new Rectangle(0, 24, 48, 48); using (Image image = provider.GetImage()) { - Matrix3x2 m = this.MakeManuallyCenteredMatrix(45, 0.8f, image); + var m = Matrix3x2.CreateScale(1.0F, 2.0F); image.Mutate(i => i.Transform(m, KnownResamplers.Spline, rectangle)); - string testDetails = $"({x0},{y0}-W{w},H{h})"; - image.DebugSave(provider, testDetails); + + image.DebugSave(provider); + image.CompareToReferenceOutput(provider); } } [Theory] - [WithTestPatternImages(nameof(ResamplerNames), 100, 200, PixelTypes.Rgba32)] + [WithTestPatternImages(nameof(ResamplerNames), 150, 150, PixelTypes.Rgba32)] public void Transform_WithSampler(TestImageProvider provider, string resamplerName) where TPixel : struct, IPixel { IResampler sampler = GetResampler(resamplerName); using (Image image = provider.GetImage()) { - Matrix3x2 rotate = Matrix3x2Extensions.CreateRotationDegrees(50); - Matrix3x2 scale = Matrix3x2Extensions.CreateScale(new SizeF(.5F, .5F)); - var translate = Matrix3x2.CreateTranslation(75, 0); - - image.Mutate(i => i.Transform(rotate * scale * translate, sampler)); + Matrix3x2 m = this.MakeManuallyCenteredMatrix(50, 0.6f, image); + + image.Mutate(i => + { + i.Transform(m, sampler); + }); + image.DebugSave(provider, resamplerName); + image.CompareToReferenceOutput(provider, resamplerName); } } diff --git a/tests/Images/External b/tests/Images/External index 9d4070dab9..02687e772f 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit 9d4070dab9e4aefa70dcd41ef98176a5d54e644f +Subproject commit 02687e772f84b1d518ab83eacdfafba476f824e6