C# 將圖片轉換為 base64 字串

要將圖片轉換成 base64 字串很簡單:
    
string filePath = @"C:\Users\ruyut\Pictures\ruyut.png";
byte[] imageBytes = File.ReadAllBytes(filePath);
string base64String = Convert.ToBase64String(imageBytes);
Console.WriteLine(base64String);
    

只是通常我們在 base64 字串前面會看到標記內容格式類型的 MIME 類型字串並沒有出現,常見的 MIME 類型字串如下:
    
data:image/jpeg;base64,
data:image/png;base64,
data:image/gif;base64,
data:image/bmp;base64,
data:image/webp;base64,
    

如果想要自動判斷格式,可以使用 System.Drawing.Common 的 Image.FromFile:
    
ImageFormat format = Image.FromFile(filePath).RawFormat; // 是上面的圖片路徑
string mimeType = ImageCodecInfo.GetImageEncoders()
    .FirstOrDefault(codec => codec.FormatID == format.Guid)?.MimeType;
    
string prefixedBase64String = $"data:{mimeType};base64,{base64String}"; // base64String 是上面產出來的 base64 字串
    

如果是 Console 應用程式中會找不到,需要從 NuGet 上安裝 System.Drawing.Common ,並且只能在 Windows 中使用,會出現這個警告: CA1416: 可在所有平台上連線到此呼叫網站。只有 'windows' 支援 'Image.FromFile(string)'。

又經過一翻研究後,終於找到 Microsoft.AspNetCore.StaticFiles 這個微軟出品的套件 先使用 NuGet 安裝 Microsoft.AspNetCore.StaticFiles 套件,或是使用 .NET CLI 執行以下指令安裝
	
dotnet add package Microsoft.AspNetCore.StaticFiles
    

取得 MIME 類型字串只要兩行,然後一樣組出來就可以了
    
var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(filePath, out string mimeType)) mimeType = "application/octet-stream";
    
string prefixedBase64String = $"data:{mimeType};base64,{base64String}"; // base64String 是上面產出來的 base64 字串
    

完整程式碼

    
// 圖片路徑
string filePath = @"C:\Users\ruyut\Pictures\sketch.png";

// 讀取圖片文件
byte[] imageBytes = File.ReadAllBytes(filePath);

// 將圖片轉換為 Base64 編碼的字串
string base64String = Convert.ToBase64String(imageBytes);

// 取得圖片的 MIME 類型字串
var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(filePath, out string mimeType)) mimeType = "application/octet-stream";

// 將 MIME 類型字串與 Base64 編碼的字串組合成 data URL
string prefixedBase64String = $"data:{mimeType};base64,{base64String}";

Console.WriteLine(prefixedBase64String); // 輸出: data:image/png;base64,iRUYUTw0TAIgoTo.....
    

留言