diff --git a/src/ImageSharp/Processing/Processors/Transforms/AffineProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/AffineProcessor.cs index b331201cc..6fdf061b8 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AffineProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AffineProcessor.cs @@ -199,12 +199,14 @@ namespace SixLabors.ImageSharp.Processing.Processors for (int xx = 0, i = minX; i <= maxX; i++, xx++) { float xWeight = xSpan[xx]; - sum += source[i, j].ToVector4() * xWeight * yWeight; + var vector = source[i, j].ToVector4(); + var mupltiplied = new Vector4(new Vector3(vector.X, vector.Y, vector.Z) * vector.W, vector.W); + sum += mupltiplied * xWeight * yWeight; } } ref TPixel dest = ref destRow[x]; - dest.PackFromVector4(sum); + dest.PackFromVector4(new Vector4(new Vector3(sum.X, sum.Y, sum.Z) / sum.W, sum.W)); } }); } diff --git a/tests/ImageSharp.Tests/Processing/Transforms/TransformTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/TransformTests.cs index c4a9437d5..b2e183de7 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/TransformTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/TransformTests.cs @@ -17,14 +17,14 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms public static readonly TheoryData TransformValues = new TheoryData { - { 45, 1, 1, 20, 10 }, - { 45, 1, 1, -20, -10 }, - { 45, 1.5f, 1.5f, 0, 0 }, + { 50, 1, 1, 20, 10 }, + { 50, 1, 1, -20, -10 }, + { 50, 1.5f, 1.5f, 0, 0 }, { 0, 2f, 1f, 0, 0 }, { 0, 1f, 2f, 0, 0 }, }; - public static readonly TheoryData ResamplerNames = + public static readonly TheoryData ResamplerNames = new TheoryData { nameof(KnownResamplers.Bicubic), @@ -64,7 +64,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms using (Image image = provider.GetImage()) { // TODO: Modify this matrix if we change our origin-concept - var rotate = Matrix3x2.CreateRotation((float)Math.PI/4f); + var rotate = Matrix3x2.CreateRotation((float)Math.PI / 4f); image.Mutate(c => c.Transform(rotate, resampler)); image.DebugSave(provider, resamplerName); @@ -88,9 +88,9 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms var translate = Matrix3x2.CreateTranslation(tx, ty); var scale = Matrix3x2.CreateScale(sx, sy); Matrix3x2 m = rotate * scale * translate; - + this.Output.WriteLine(m.ToString()); - + image.Mutate(i => i.Transform(m)); image.DebugSave(provider, $"R({angleDeg})_S({sx},{sy})_T({tx},{ty})"); } @@ -104,10 +104,12 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms IResampler sampler = GetResampler(resamplerName); using (Image image = provider.GetImage()) { - Matrix3x2 rotate = Matrix3x2Extensions.CreateRotationDegrees(45); + 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, sampler)); + image.Mutate(i => i.Transform(rotate * scale * translate, sampler)); image.DebugSave(provider, resamplerName); } }