scry/test/Scry.Tests/ImagePreprocessorTests.cs
Chris Kruining 0801ceee6a
.
2026-02-05 09:41:07 +01:00

131 lines
3.8 KiB
C#

using Scry.Core.Imaging;
using SkiaSharp;
using Xunit;
namespace Scry.Tests;
public class ImagePreprocessorTests
{
[Fact]
public void Resize_ProducesCorrectDimensions()
{
using var bitmap = CreateTestBitmap(100, 100);
using var resized = ImagePreprocessor.Resize(bitmap, 32, 32);
Assert.Equal(32, resized.Width);
Assert.Equal(32, resized.Height);
}
[Fact]
public void ToGrayscale_ProducesGrayscaleImage()
{
using var bitmap = CreateColorBitmap(10, 10);
using var grayscale = ImagePreprocessor.ToGrayscale(bitmap);
Assert.Equal(10, grayscale.Width);
Assert.Equal(10, grayscale.Height);
}
[Fact]
public void ApplyClahe_PreservesDimensions()
{
using var bitmap = CreateTestBitmap(64, 64);
using var result = ImagePreprocessor.ApplyClahe(bitmap);
Assert.Equal(64, result.Width);
Assert.Equal(64, result.Height);
}
[Fact]
public void ApplyClahe_EnhancesContrast()
{
using var bitmap = CreateLowContrastBitmap(64, 64);
using var result = ImagePreprocessor.ApplyClahe(bitmap);
Assert.NotNull(result);
Assert.Equal(bitmap.Width, result.Width);
Assert.Equal(bitmap.Height, result.Height);
}
[Theory]
[InlineData("varying_quality/test1.jpg")]
[InlineData("low_light/glare_toploader.png")]
[InlineData("foil/rainbow_foil_secret_lair.jpg")]
public void ApplyClahe_RealImages_DoesNotCrash(string imagePath)
{
var fullPath = Path.Combine("TestImages", imagePath);
if (!File.Exists(fullPath))
{
return;
}
using var bitmap = SKBitmap.Decode(fullPath);
Assert.NotNull(bitmap);
using var result = ImagePreprocessor.ApplyClahe(bitmap);
Assert.Equal(bitmap.Width, result.Width);
Assert.Equal(bitmap.Height, result.Height);
}
private static SKBitmap CreateTestBitmap(int width, int height)
{
var bitmap = new SKBitmap(width, height, SKColorType.Rgba8888, SKAlphaType.Premul);
using var canvas = new SKCanvas(bitmap);
canvas.Clear(SKColors.Gray);
return bitmap;
}
private static SKBitmap CreateColorBitmap(int width, int height)
{
var bitmap = new SKBitmap(width, height, SKColorType.Rgba8888, SKAlphaType.Premul);
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
var r = (byte)(x * 255 / width);
var g = (byte)(y * 255 / height);
var b = (byte)((x + y) * 127 / (width + height));
bitmap.SetPixel(x, y, new SKColor(r, g, b));
}
}
return bitmap;
}
private static SKBitmap CreateLowContrastBitmap(int width, int height)
{
var bitmap = new SKBitmap(width, height, SKColorType.Rgba8888, SKAlphaType.Premul);
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
var gray = (byte)(120 + (x + y) % 20);
bitmap.SetPixel(x, y, new SKColor(gray, gray, gray));
}
}
return bitmap;
}
private static (byte Min, byte Max) GetLuminanceRange(SKBitmap bitmap)
{
byte min = 255;
byte max = 0;
for (var y = 0; y < bitmap.Height; y++)
{
for (var x = 0; x < bitmap.Width; x++)
{
var pixel = bitmap.GetPixel(x, y);
var luminance = (byte)(0.299 * pixel.Red + 0.587 * pixel.Green + 0.114 * pixel.Blue);
min = Math.Min(min, luminance);
max = Math.Max(max, luminance);
}
}
return (min, max);
}
}