namespace AIStudio.Tools;
///
/// Helper methods for image handling, particularly for Base64 images.
///
public static class ImageHelpers
{
///
/// Detects the MIME type of an image from its Base64-encoded header.
///
/// The Base64-encoded image string.
/// The detected MIME type (e.g., "image/png", "image/jpeg").
public static string DetectMimeType(ReadOnlySpan base64ImageString)
{
if (base64ImageString.IsWhiteSpace() || base64ImageString.Length < 10)
return "image"; // Fallback
var header = base64ImageString[..Math.Min(20, base64ImageString.Length)];
//
// See https://en.wikipedia.org/wiki/List_of_file_signatures
//
// PNG: iVBORw0KGgo
if (header.StartsWith("iVBORw0KGgo", StringComparison.Ordinal))
return "image/png";
// JPEG: /9j/
if (header.StartsWith("/9j/", StringComparison.Ordinal))
return "image/jpeg";
// GIF: R0lGOD
if (header.StartsWith("R0lGOD", StringComparison.Ordinal))
return "image/gif";
// WebP: UklGR
if (header.StartsWith("UklGR", StringComparison.Ordinal))
return "image/webp";
// BMP: Qk
if (header.StartsWith("Qk", StringComparison.Ordinal))
return "image/bmp";
// Default fallback:
return "image";
}
///
/// Converts a Base64 string to a data URL suitable for use in HTML img src attributes.
///
/// The Base64-encoded image string.
/// Optional MIME type. If not provided, it will be auto-detected.
/// A data URL in the format "data:image/type;base64,..."
public static string ToDataUrl(string base64String, string? mimeType = null)
{
if (string.IsNullOrEmpty(base64String))
return string.Empty;
var detectedMimeType = mimeType ?? DetectMimeType(base64String);
return $"data:{detectedMimeType};base64,{base64String}";
}
}