From 3ab4c9311a2eeae24cabd7c6eff79421d98e612e Mon Sep 17 00:00:00 2001 From: Sverre Rekvin Date: Mon, 27 Jun 2016 03:20:26 +0200 Subject: [PATCH] Inv matrix, traget size of image was wrong Former-commit-id: b62be965af469e6c365f57261b5790ac05475329 Former-commit-id: 621c23abc663803c7b49e81ce3e576a2042dc740 Former-commit-id: e133d3a733742ec6038f8fb9f2053731e6f44618 --- .../Samplers/Processors/SkewProcessor.cs | 55 ++++++++----------- .../Processors/Samplers/SamplerTests.cs | 2 +- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/src/ImageProcessorCore/Samplers/Processors/SkewProcessor.cs b/src/ImageProcessorCore/Samplers/Processors/SkewProcessor.cs index a5f5b3122..119aa37ed 100644 --- a/src/ImageProcessorCore/Samplers/Processors/SkewProcessor.cs +++ b/src/ImageProcessorCore/Samplers/Processors/SkewProcessor.cs @@ -46,15 +46,6 @@ namespace ImageProcessorCore set { - if (value > 360) - { - value -= 360; - } - - if (value < 0) - { - value += 360; - } this.angleX = value; } @@ -72,15 +63,7 @@ namespace ImageProcessorCore set { - if (value > 360) - { - value -= 360; - } - if (value < 0) - { - value += 360; - } this.angleY = value; } @@ -101,10 +84,12 @@ namespace ImageProcessorCore { if (this.Expand) { - Point centre = new Point(0,0); + Point centre = new Point(0, 0); Matrix3x2 skew = Point.CreateSkew(centre, -this.angleX, -angleY); - Rectangle rect = ImageMaths.GetBoundingRectangle(source.Bounds, skew); - target.SetPixels(rect.Width, rect.Height, new float[rect.Width*rect.Height*4]); + Matrix3x2 invSkew; + Matrix3x2.Invert(skew, out invSkew); + Rectangle rect = ImageMaths.GetBoundingRectangle(source.Bounds, invSkew); + target.SetPixels(rect.Width, rect.Height, new float[rect.Width * rect.Height * 4]); } } @@ -114,9 +99,23 @@ namespace ImageProcessorCore int height = target.Height; int startX = 0; int endX = target.Width; - Point centre; - centre = new Point(0,0); - Matrix3x2 skew = Point.CreateSkew(centre, -this.angleX, -this.angleY); + Point centre = new Point(0, 0); + + Matrix3x2 invSkew = new Matrix3x2(); + var skew = Point.CreateSkew(centre, -this.angleX, -this.angleY); + Matrix3x2.Invert(skew, out invSkew); + + Vector2 rightTop = Vector2.Transform(new Vector2(source.Width, 0), invSkew); + Vector2 leftBottom = Vector2.Transform(new Vector2(0, source.Height), invSkew); + + + if (angleX < 0 && AngleY > 0) + skew = Point.CreateSkew(new Point((int)-leftBottom.X, (int)leftBottom.Y), -this.angleX, -this.angleY); + if (angleX > 0 && AngleY < 0) + skew = Point.CreateSkew(new Point((int)rightTop.X, (int)-rightTop.Y), -this.angleX, -this.angleY); + if (angleX < 0 && AngleY < 0) + skew = Point.CreateSkew(new Point(target.Width-1, target.Height-1), -this.angleX, -this.angleY); + Parallel.For( 0, height, @@ -129,16 +128,6 @@ namespace ImageProcessorCore { target[x, y] = source[skewed.X, skewed.Y]; } - - else - { - // just for debugging. - Color c= source[Math.Abs(skewed.X%(source.Width-1)), Math.Abs(skewed.Y % (source.Height - 1))]; - c.B = 0; - c.G = 0; - target[x, y]=c; - } - } this.OnRowProcessed(); }); diff --git a/tests/ImageProcessorCore.Tests/Processors/Samplers/SamplerTests.cs b/tests/ImageProcessorCore.Tests/Processors/Samplers/SamplerTests.cs index 506a2274b..2f85dd3e5 100644 --- a/tests/ImageProcessorCore.Tests/Processors/Samplers/SamplerTests.cs +++ b/tests/ImageProcessorCore.Tests/Processors/Samplers/SamplerTests.cs @@ -500,7 +500,7 @@ using (Image image = new Image(stream)) using (FileStream output = File.OpenWrite($"TestOutput/Skew/{filename}")) { - image.Skew(15, 12, this.ProgressUpdate) + image.Skew(-15, 12, this.ProgressUpdate) .Save(output); }