C# 中图片与 BASE64 码互相转换
BASE64 编码是一种将二进制数据转换为可打印 ASCII 字符的编码方式,广泛应用于在文本协议中传输图片、文件等二进制数据。在 C# 开发中,经常需要将图片文件转换为 BASE64 字符串(例如用于嵌入 HTML 或 JSON),或者将 BASE64 字符串解码还原为图片文件或字节数组。本文将详细介绍这两种转换的实现方法,并提供完整的可运行示例代码。
一、图片转换为 BASE64 字符串
图片转 BASE64 的核心步骤:
读取图片文件的字节数据(通过文件路径、流或字节数组);
调用
System.Convert.ToBase64String()方法将字节数组编码为 BASE64 字符串;根据实际需要,可以添加 Data URI 前缀(如
data:image/png;base64,),以便直接用于 HTML 的 img 标签。
1.1 从文件路径转换
使用 File.ReadAllBytes() 读取文件所有字节,然后直接转换:
public static string ImageFileToBase64(string imageFilePath)
{
byte[] imageBytes = File.ReadAllBytes(imageFilePath);
string base64 = Convert.ToBase64String(imageBytes);
return base64;
}1.2 添加 Data URI 前缀(可选)
如果希望 BASE64 字符串能直接作为 img 标签的 src,需要根据图片格式添加前缀:
public static string ImageFileToBase64WithPrefix(string imageFilePath)
{
// 根据扩展名确定 MIME 类型
string extension = Path.GetExtension(imageFilePath).ToLower();
string mimeType = extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".bmp" => "image/bmp",
".webp" => "image/webp",
_ => "application/octet-stream"
};
byte[] imageBytes = File.ReadAllBytes(imageFilePath);
string base64 = Convert.ToBase64String(imageBytes);
return $"data:{mimeType};base64,{base64}";
}1.3 从 Stream 或字节数组转换
如果图片数据来源于内存流或数据库,直接传递字节数组即可:
public static string ByteArrayToBase64(byte[] imageBytes)
{
return Convert.ToBase64String(imageBytes);
}二、BASE64 字符串转换为图片
反向转换步骤:
如果 BASE64 字符串包含 Data URI 前缀,需要先去除前缀部分;
调用
Convert.FromBase64String()将 BASE64 字符串解码为字节数组;将字节数组保存为文件,或通过 MemoryStream 创建
Image对象(如果需要进一步处理)。
2.1 解码为字节数组
public static byte[] Base64ToByteArray(string base64String)
{
// 如果包含 data URI 前缀,先剥离
const string dataPrefix = "data:";
int commaIndex = base64String.IndexOf(',');
if (base64String.StartsWith(dataPrefix) && commaIndex != -1)
{
base64String = base64String.Substring(commaIndex + 1);
}
return Convert.FromBase64String(base64String);
}2.2 保存为图片文件
public static void Base64ToImageFile(string base64String, string outputFilePath)
{
byte[] imageBytes = Base64ToByteArray(base64String);
File.WriteAllBytes(outputFilePath, imageBytes);
}2.3 创建 System.Drawing.Image 对象(Windows 专用)
如果需要将 BASE64 转换为可显示的 Image 对象(例如在 WinForms 或 WPF 中),可以使用 System.Drawing.Common 库:
using System.Drawing;
using System.IO;
public static Image Base64ToImage(string base64String)
{
byte[] imageBytes = Base64ToByteArray(base64String);
using (MemoryStream ms = new MemoryStream(imageBytes))
{
return Image.FromStream(ms);
}
}注意:System.Drawing.Common在 .NET 6 及更高版本中仅支持 Windows 操作系统。如果需要在跨平台应用(如 ASP.NET Core)中操作图片,建议仅处理字节数组或使用SixLabors.ImageSharp等库。
三、完整示例:控制台应用
下面给出一个完整的控制台应用示例,包含两个方向的转换,并在控制台输出结果:
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
// 1. 图片转 BASE64(无前缀)
string inputFile = @"C:Imagesexample.png"; // 请替换为实际图片路径
if (!File.Exists(inputFile))
{
Console.WriteLine("文件不存在,请检查路径。");
return;
}
string base64 = ImageFileToBase64(inputFile);
Console.WriteLine("图片转 BASE64(前100字符):");
Console.WriteLine(base64.Substring(0, Math.Min(100, base64.Length)) + "...");
Console.WriteLine();
// 2. BASE64 转图片(保存为新文件)
string outputFile = @"C:Imagesoutput_from_base64.png";
Base64ToImageFile(base64, outputFile);
Console.WriteLine($"已成功将 BASE64 还原为图片文件:{outputFile}");
}
public static string ImageFileToBase64(string imageFilePath)
{
byte[] imageBytes = File.ReadAllBytes(imageFilePath);
return Convert.ToBase64String(imageBytes);
}
public static byte[] Base64ToByteArray(string base64String)
{
const string dataPrefix = "data:";
int commaIndex = base64String.IndexOf(',');
if (base64String.StartsWith(dataPrefix) && commaIndex != -1)
{
base64String = base64String.Substring(commaIndex + 1);
}
return Convert.FromBase64String(base64String);
}
public static void Base64ToImageFile(string base64String, string outputFilePath)
{
byte[] imageBytes = Base64ToByteArray(base64String);
File.WriteAllBytes(outputFilePath, imageBytes);
}
}四、注意事项与性能建议
大小限制:BASE64 编码会使数据体积增加约 33%。对于大图片(如超过 10MB),转换后字符串会非常长,可能导致内存占用过高。建议评估场景,必要时采取分块传输或使用文件流。
前缀处理:在进行解码之前,务必判断是否包含
data:前缀。注意前缀格式为data:[MIME];base64,逗号前的部分需要剥离。跨平台兼容:如果应用需要部署在 Linux 或 macOS 上,避免使用
System.Drawing.Common中的 Image 类。仅使用字节数组操作即可满足大部分需求。安全性:当从用户输入接收 BASE64 字符串时,需要验证其是否为有效的 BASE64 格式(可使用
Convert.TryFromBase64String方法),并可限制字符串长度以防拒绝服务攻击。
五、总结
C# 中图片与 BASE64 的互相转换主要依赖 Convert.ToBase64String 和 Convert.FromBase64String 两个核心方法。结合文件读写和流操作,可以轻松实现各种场景下的转换需求。无论你是嵌入式前端资源、在 RESTful API 中传输图片,还是处理用户上传的文件,本文提供的方法均能直接复用。
如需获取最新 .NET 文档或示例,请访问官方文档网站:https://docs.microsoft.com/dotnet