2026-02-14 19:20:25 +01:00
|
|
|
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;
|
2026-02-14 19:20:25 +01:00
|
|
|
|
|
|
|
|
namespace MaddoShared.Benchmarks.Helpers;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-05-28 20:27:05 +02:00
|
|
|
/// Helper class to generate test images for benchmarking.
|
2026-02-14 19:20:25 +01:00
|
|
|
/// </summary>
|
|
|
|
|
public static class TestImageGenerator
|
|
|
|
|
{
|
|
|
|
|
public static void GenerateTestImages(
|
2026-05-28 20:27:05 +02:00
|
|
|
string outputDirectory,
|
|
|
|
|
int imageCount,
|
|
|
|
|
int width = 4000,
|
2026-02-14 19:20:25 +01:00
|
|
|
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-02-14 19:20:25 +01:00
|
|
|
|
2026-05-28 20:27:05 +02:00
|
|
|
for (var i = 0; i < imageCount; i++)
|
2026-02-14 19:20:25 +01:00
|
|
|
{
|
|
|
|
|
var targetDir = outputDirectory;
|
2026-05-28 20:27:05 +02:00
|
|
|
|
2026-02-14 19:20:25 +01: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-02-14 19:20:25 +01:00
|
|
|
}
|
|
|
|
|
|
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);
|
2026-02-14 19:20:25 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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-02-14 19:20:25 +01:00
|
|
|
{
|
2026-05-28 20:27:05 +02:00
|
|
|
image.ProcessPixelRows(accessor =>
|
2026-02-14 19:20:25 +01:00
|
|
|
{
|
2026-05-28 20:27:05 +02:00
|
|
|
for (var shape = 0; shape < 20; shape++)
|
2026-02-14 19:20:25 +01:00
|
|
|
{
|
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-02-14 19:20:25 +01:00
|
|
|
}
|
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);
|
2026-02-14 19:20:25 +01:00
|
|
|
}
|
|
|
|
|
}
|