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}"; } }