//
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
//
namespace ImageSharp.Tests.Processing.Transforms
{
using ImageSharp.PixelFormats;
using ImageSharp.Processing;
using Xunit;
public class ResizeTests : FileTestBase
{
public static readonly string[] ResizeFiles = { TestImages.Jpeg.Baseline.Calliphora };
public static readonly TheoryData ReSamplers =
new TheoryData
{
{ "Bicubic", new BicubicResampler() },
{ "Triangle", new TriangleResampler() },
{ "NearestNeighbor", new NearestNeighborResampler() },
{ "Box", new BoxResampler() },
{ "Lanczos3", new Lanczos3Resampler() },
{ "Lanczos5", new Lanczos5Resampler() },
{ "MitchellNetravali", new MitchellNetravaliResampler() },
{ "Lanczos8", new Lanczos8Resampler() },
{ "Hermite", new HermiteResampler() },
{ "Spline", new SplineResampler() },
{ "Robidoux", new RobidouxResampler() },
{ "RobidouxSharp", new RobidouxSharpResampler() },
{ "Welch", new WelchResampler() }
};
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResize(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
image.Resize(image.Width / 2, image.Height / 2, sampler, true)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeFromSourceRectangle(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var sourceRectangle = new Rectangle(image.Width / 8, image.Height / 8, image.Width / 4, image.Height / 4);
var destRectangle = new Rectangle(image.Width / 4, image.Height / 4, image.Width / 2, image.Height / 2);
image.Resize(image.Width, image.Height, sampler, sourceRectangle, destRectangle, false)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWidthAndKeepAspect(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
image.Resize(image.Width / 3, 0, sampler, false)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeHeightAndKeepAspect(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
image.Resize(0, image.Height / 3, sampler, false)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWithCropWidthMode(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var options = new ResizeOptions
{
Sampler = sampler,
Size = new Size(image.Width / 2, image.Height)
};
image.Resize(options)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWithCropHeightMode(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var options = new ResizeOptions
{
Sampler = sampler,
Size = new Size(image.Width, image.Height / 2)
};
image.Resize(options)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWithPadMode(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var options = new ResizeOptions
{
Sampler = sampler,
Size = new Size(image.Width + 200, image.Height),
Mode = ResizeMode.Pad
};
image.Resize(options)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWithBoxPadMode(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var options = new ResizeOptions
{
Sampler = sampler,
Size = new Size(image.Width + 200, image.Height + 200),
Mode = ResizeMode.BoxPad
};
image.Resize(options)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWithMaxMode(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var options = new ResizeOptions
{
Sampler = sampler,
Size = new Size(300, 300),
Mode = ResizeMode.Max
};
image.Resize(options)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWithMinMode(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var options = new ResizeOptions
{
Sampler = sampler,
Size = new Size((int)MathF.Round(image.Width * .75F), (int)MathF.Round(image.Height * .95F)),
Mode = ResizeMode.Min
};
image.Resize(options)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[WithFileCollection(nameof(ResizeFiles), nameof(ReSamplers), StandardPixelType)]
public void ImageShouldResizeWithStretchMode(TestImageProvider provider, string name, IResampler sampler)
where TPixel : struct, IPixel
{
using (Image image = provider.GetImage())
{
var options = new ResizeOptions
{
Sampler = sampler,
Size = new Size(image.Width / 2, image.Height),
Mode = ResizeMode.Stretch
};
image.Resize(options)
.DebugSave(provider, name, Extensions.Bmp);
}
}
[Theory]
[InlineData(-2, 0)]
[InlineData(-1, 0)]
[InlineData(0, 1)]
[InlineData(1, 0)]
[InlineData(2, 0)]
public static void BicubicWindowOscillatesCorrectly(float x, float expected)
{
var sampler = new BicubicResampler();
float result = sampler.GetValue(x);
Assert.Equal(result, expected);
}
[Theory]
[InlineData(-2, 0)]
[InlineData(-1, 0)]
[InlineData(0, 1)]
[InlineData(1, 0)]
[InlineData(2, 0)]
public static void TriangleWindowOscillatesCorrectly(float x, float expected)
{
var sampler = new TriangleResampler();
float result = sampler.GetValue(x);
Assert.Equal(result, expected);
}
[Theory]
[InlineData(-2, 0)]
[InlineData(-1, 0)]
[InlineData(0, 1)]
[InlineData(1, 0)]
[InlineData(2, 0)]
public static void Lanczos3WindowOscillatesCorrectly(float x, float expected)
{
var sampler = new Lanczos3Resampler();
float result = sampler.GetValue(x);
Assert.Equal(result, expected);
}
[Theory]
[InlineData(-4, 0)]
[InlineData(-2, 0)]
[InlineData(0, 1)]
[InlineData(2, 0)]
[InlineData(4, 0)]
public static void Lanczos5WindowOscillatesCorrectly(float x, float expected)
{
var sampler = new Lanczos5Resampler();
float result = sampler.GetValue(x);
Assert.Equal(result, expected);
}
}
}