Browse Source

retrain untouched pixels when applying filter

af/merge-core
Scott Williams 9 years ago
parent
commit
6ec8ef8b82
  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 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))
using (PixelAccessor<TPixel> 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);
}
}

38
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<int> GaussianBlurValues
= new TheoryData<int>
@ -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<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);
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<TPixel>.HotPink, rect);
source.Fill(NamedColors<TPixel>.HotPink, rect);
ImageComparer.CheckSimilarity(image, source);
}
}
}

Loading…
Cancel
Save