using System; using System.IO; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.PixelFormats; namespace MaddoShared.Benchmarks.Helpers; /// /// Helper class to generate test images for benchmarking. /// public static class TestImageGenerator { public static void GenerateTestImages( string outputDirectory, int imageCount, int width = 4000, int height = 3000, bool includeSubfolders = false) { Directory.CreateDirectory(outputDirectory); var random = new Random(42); var encoder = new JpegEncoder { Quality = 85 }; for (var i = 0; i < imageCount; i++) { var targetDir = outputDirectory; 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)) { continue; } using var image = new Image(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); } } private static void AddBenchmarkTexture(Image image, Random random) { image.ProcessPixelRows(accessor => { for (var shape = 0; shape < 20; shape++) { 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; } } } }); } private static Rgba32 RandomColor(Random random) { return new Rgba32( (byte)random.Next(256), (byte)random.Next(256), (byte)random.Next(256), 255); } }