程序的基本思路是使用 .NET Framework 提供的 base64 转换器,其中单独剔出来了一个 ImageFormatGuidToString() 方法,这个方法是为了确保图像保存到内存流的时候用的是正常的图像格式。如果是使用 Image 类创建的新图像,那么它的 RawFormat 参数值并不是常规的格式,这个时候如果使用这种图像格式保存到内存流中会导致失败,具体的异常消息大概是 值不能为 null。参数名:encoder,所以这个地方在图像保存到内存流之前首先检查了现有图像的格式。转换后的 base64 字符串是没有标识头的,要在 HTML 标签中显示需要自己加上头部,如 “data:image/png;base64,...”:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
// Image 对象转换为 base64 字符串
string ImageToBase64(Image _image)
{
MemoryStream ms = new MemoryStream();
try
{
if (ImageFormatGuidToString(_image.RawFormat) == null)
{
_image.Save(ms, ImageFormat.Png);
}
else
{
_image.Save(ms, _image.RawFormat);
}
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
return Convert.ToBase64String(arr);
}
catch
{
return null;
}
finally
{
ms.Close();
}
}
// base64 字符串转换为 Image 对象
Image Base64ToImage(string _base64)
{
byte[] arr = Convert.FromBase64String(_base64);
MemoryStream ms = new MemoryStream(arr);
Bitmap bmp = new Bitmap(ms);
try
{
Image result = new Bitmap(bmp.Width, bmp.Height);
Graphics g = Graphics.FromImage(result);
g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
g.Dispose();
return result;
}
catch
{
return null;
}
finally
{
bmp.Dispose();
ms.Close();
}
}
// 用于检查图像格式
string ImageFormatGuidToString(ImageFormat _format)
{
if (_format.Guid == ImageFormat.Bmp.Guid)
{
return "bmp";
}
else if (_format.Guid == ImageFormat.Gif.Guid)
{
return "gif";
}
else if (_format.Guid == ImageFormat.Jpeg.Guid)
{
return "jpg";
}
else if (_format.Guid == ImageFormat.Png.Guid)
{
return "png";
}
else if (_format.Guid == ImageFormat.Icon.Guid)
{
return "ico";
}
else if (_format.Guid == ImageFormat.Emf.Guid)
{
return "emf";
}
else if (_format.Guid == ImageFormat.Exif.Guid)
{
return "exif";
}
else if (_format.Guid == ImageFormat.Tiff.Guid)
{
return "tiff";
}
else if (_format.Guid == ImageFormat.Wmf.Guid)
{
return "wmf";
}
else
{
return null;
}
}
相关环境:.NET Framework 4.0