Catalog/MaddoShared.Benchmarks/Helpers/TestImageGenerator.cs

90 lines
2.7 KiB
C#
Raw Permalink Normal View History

using System;
using System.IO;
2026-05-28 20:27:05 +02:00
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.PixelFormats;
namespace MaddoShared.Benchmarks.Helpers;
/// <summary>
2026-05-28 20:27:05 +02:00
/// Helper class to generate test images for benchmarking.
/// </summary>
public static class TestImageGenerator
{
public static void GenerateTestImages(
2026-05-28 20:27:05 +02:00
string outputDirectory,
int imageCount,
int width = 4000,
int height = 3000,
bool includeSubfolders = false)
{
Directory.CreateDirectory(outputDirectory);
2026-05-28 20:27:05 +02:00
var random = new Random(42);
var encoder = new JpegEncoder { Quality = 85 };
2026-05-28 20:27:05 +02:00
for (var i = 0; i < imageCount; i++)
{
var targetDir = outputDirectory;
2026-05-28 20:27:05 +02:00
if (includeSubfolders && i % 10 == 0)
{
targetDir = Path.Combine(outputDirectory, $"Subfolder_{i / 10}");
Directory.CreateDirectory(targetDir);
}
var filePath = Path.Combine(targetDir, $"test_image_{i:D5}.jpg");
if (File.Exists(filePath))
{
2026-05-28 20:27:05 +02:00
continue;
}
2026-05-28 20:27:05 +02:00
using var image = new Image<Rgba32>(width, height, RandomColor(random));
AddBenchmarkTexture(image, random);
image.Save(filePath, encoder);
}
}
public static void CleanupTestImages(string directory)
{
if (Directory.Exists(directory))
{
Directory.Delete(directory, recursive: true);
}
}
2026-05-28 20:27:05 +02:00
private static void AddBenchmarkTexture(Image<Rgba32> image, Random random)
{
2026-05-28 20:27:05 +02:00
image.ProcessPixelRows(accessor =>
{
2026-05-28 20:27:05 +02:00
for (var shape = 0; shape < 20; shape++)
{
2026-05-28 20:27:05 +02:00
var color = RandomColor(random);
var startX = random.Next(image.Width);
var startY = random.Next(image.Height);
var width = random.Next(200, Math.Min(800, image.Width) + 1);
var height = random.Next(200, Math.Min(800, image.Height) + 1);
var endX = Math.Min(accessor.Width, startX + width);
var endY = Math.Min(accessor.Height, startY + height);
for (var y = startY; y < endY; y++)
{
var row = accessor.GetRowSpan(y);
for (var x = startX; x < endX; x++)
{
row[x] = color;
}
}
}
2026-05-28 20:27:05 +02:00
});
}
private static Rgba32 RandomColor(Random random)
{
return new Rgba32(
(byte)random.Next(256),
(byte)random.Next(256),
(byte)random.Next(256),
255);
}
}