Browse Source

retrain untouched pixels when applying filter

pull/195/head
Scott Williams 9 years ago
parent
commit
63eb9a8cd7
  1. 13
      src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs
  2. 38
      tests/ImageSharp.Tests/Processors/Filters/GaussianBlurTest.cs

13
src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs

@ -45,16 +45,11 @@ namespace ImageSharp.Processing.Processors
int width = source.Width; int width = source.Width;
int height = source.Height; int height = source.Height;
using (PixelAccessor<TPixel> targetPixels = new PixelAccessor<TPixel>(width, height)) using (PixelAccessor<TPixel> firstPassPixels = new PixelAccessor<TPixel>(width, height))
using (PixelAccessor<TPixel> sourcePixels = source.Lock())
{ {
using (PixelAccessor<TPixel> firstPassPixels = new PixelAccessor<TPixel>(width, height)) this.ApplyConvolution(firstPassPixels, sourcePixels, source.Bounds, this.KernelX);
using (PixelAccessor<TPixel> sourcePixels = source.Lock()) this.ApplyConvolution(sourcePixels, firstPassPixels, sourceRectangle, this.KernelY);
{
this.ApplyConvolution(firstPassPixels, sourcePixels, sourceRectangle, this.KernelX);
this.ApplyConvolution(targetPixels, firstPassPixels, sourceRectangle, this.KernelY);
}
source.SwapPixelsBuffers(targetPixels);
} }
} }

38
tests/ImageSharp.Tests/Processors/Filters/GaussianBlurTest.cs

@ -6,10 +6,10 @@
namespace ImageSharp.Tests namespace ImageSharp.Tests
{ {
using System.IO; using System.IO;
using ImageSharp.PixelFormats;
using Xunit; using Xunit;
public class GaussianBlurTest : FileTestBase public class GaussianBlurTest
{ {
public static readonly TheoryData<int> GaussianBlurValues public static readonly TheoryData<int> GaussianBlurValues
= new TheoryData<int> = new TheoryData<int>
@ -19,19 +19,33 @@ namespace ImageSharp.Tests
}; };
[Theory] [Theory]
[MemberData(nameof(GaussianBlurValues))] [WithTestPatternImages(nameof(GaussianBlurValues), 320, 240, PixelTypes.StandardImageClass)]
public void ImageShouldApplyGaussianBlurFilter(int value) public void ImageShouldApplyGaussianBlurFilter<TPixel>(TestImageProvider<TPixel> provider, int value)
where TPixel : struct, IPixel<TPixel>
{ {
string path = this.CreateOutputDirectory("GaussianBlur"); using (Image<TPixel> image = provider.GetImage())
{
image.GaussianBlur(value)
.DebugSave(provider);
}
}
foreach (TestFile file in Files) [Theory]
[WithTestPatternImages(nameof(GaussianBlurValues), 320, 240, PixelTypes.StandardImageClass)]
public void ImageShouldApplyGaussianBlurFilterInBox<TPixel>(TestImageProvider<TPixel> provider, int value)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> source = provider.GetImage())
using (Image<TPixel> image = new Image<TPixel>(source))
{ {
string filename = file.GetFileName(value); Rectangle rect = new Rectangle(image.Width / 4, image.Height / 4, image.Width / 2, image.Height / 2);
using (Image image = file.CreateImage()) image.GaussianBlur(value, rect)
using (FileStream output = File.OpenWrite($"{path}/{filename}")) .DebugSave(provider);
{
image.GaussianBlur(value).Save(output); // lets draw identical shapes over the blured areas and ensure that it didn't change the outer area
} image.Fill(NamedColors<TPixel>.HotPink, rect);
source.Fill(NamedColors<TPixel>.HotPink, rect);
ImageComparer.CheckSimilarity(image, source);
} }
} }
} }

Loading…
Cancel
Save