From 6ec8ef8b8223454e01650712a872c127abae72fc Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Thu, 27 Apr 2017 18:56:43 +0100 Subject: [PATCH] retrain untouched pixels when applying filter --- .../Convolution/Convolution2PassProcessor.cs | 13 ++----- .../Processors/Filters/GaussianBlurTest.cs | 38 +++++++++++++------ 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs index 9b95cb1a37..965a725a13 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs @@ -45,16 +45,11 @@ namespace ImageSharp.Processing.Processors int width = source.Width; int height = source.Height; - using (PixelAccessor targetPixels = new PixelAccessor(width, height)) + using (PixelAccessor firstPassPixels = new PixelAccessor(width, height)) + using (PixelAccessor sourcePixels = source.Lock()) { - using (PixelAccessor firstPassPixels = new PixelAccessor(width, height)) - using (PixelAccessor sourcePixels = source.Lock()) - { - this.ApplyConvolution(firstPassPixels, sourcePixels, sourceRectangle, this.KernelX); - this.ApplyConvolution(targetPixels, firstPassPixels, sourceRectangle, this.KernelY); - } - - source.SwapPixelsBuffers(targetPixels); + this.ApplyConvolution(firstPassPixels, sourcePixels, source.Bounds, this.KernelX); + this.ApplyConvolution(sourcePixels, firstPassPixels, sourceRectangle, this.KernelY); } } diff --git a/tests/ImageSharp.Tests/Processors/Filters/GaussianBlurTest.cs b/tests/ImageSharp.Tests/Processors/Filters/GaussianBlurTest.cs index 809ffa2f56..dd17aaeb06 100644 --- a/tests/ImageSharp.Tests/Processors/Filters/GaussianBlurTest.cs +++ b/tests/ImageSharp.Tests/Processors/Filters/GaussianBlurTest.cs @@ -6,10 +6,10 @@ namespace ImageSharp.Tests { using System.IO; - + using ImageSharp.PixelFormats; using Xunit; - public class GaussianBlurTest : FileTestBase + public class GaussianBlurTest { public static readonly TheoryData GaussianBlurValues = new TheoryData @@ -19,19 +19,33 @@ namespace ImageSharp.Tests }; [Theory] - [MemberData(nameof(GaussianBlurValues))] - public void ImageShouldApplyGaussianBlurFilter(int value) + [WithTestPatternImages(nameof(GaussianBlurValues), 320, 240, PixelTypes.StandardImageClass)] + public void ImageShouldApplyGaussianBlurFilter(TestImageProvider provider, int value) + where TPixel : struct, IPixel { - string path = this.CreateOutputDirectory("GaussianBlur"); + using (Image image = provider.GetImage()) + { + image.GaussianBlur(value) + .DebugSave(provider); + } + } - foreach (TestFile file in Files) + [Theory] + [WithTestPatternImages(nameof(GaussianBlurValues), 320, 240, PixelTypes.StandardImageClass)] + public void ImageShouldApplyGaussianBlurFilterInBox(TestImageProvider provider, int value) + where TPixel : struct, IPixel + { + using (Image source = provider.GetImage()) + using (Image image = new Image(source)) { - string filename = file.GetFileName(value); - using (Image image = file.CreateImage()) - using (FileStream output = File.OpenWrite($"{path}/{filename}")) - { - image.GaussianBlur(value).Save(output); - } + Rectangle rect = new Rectangle(image.Width / 4, image.Height / 4, image.Width / 2, image.Height / 2); + image.GaussianBlur(value, rect) + .DebugSave(provider); + + // lets draw identical shapes over the blured areas and ensure that it didn't change the outer area + image.Fill(NamedColors.HotPink, rect); + source.Fill(NamedColors.HotPink, rect); + ImageComparer.CheckSimilarity(image, source); } } }