base64是网络上最常见的用于传输8Bit字节码编码之一,base64就是一种基于64个可打印字符来表示二进制数据的方法。
由于base64以上优点,所以被广泛应用于计算机的各个领域中。下面通过代码给大家介绍下c# 图片与base64和byte数组相互转的方法。网上找的很多方法用base64或byte数组转图片的时候有概率抛出gdi+中发生一般性错误的异常,本文的转图片例子已经解决了这个问题。那么我们先来看下c#如何把图片转成base64?
/// <summary>
/// 将图片数据转换为Base64字符串
/// </summary>
/// <param name="bitmap">图片对象</param>
private static string ToBase64(Bitmap bitmap)
{
BinaryFormatter binFormatter = new BinaryFormatter();
MemoryStream memStream = new MemoryStream();
binFormatter.Serialize(memStream, bitmap);
byte[] bytes = memStream.GetBuffer();
string base64 = Convert.ToBase64String(bytes);
return base64;
}
/// <summary>
/// 将Base64字符串转换为图片
/// </summary>
/// <param name="@base64">base64字符串</param>
private static Bitmap ToImage(string @base64)
{
//将base64头部信息替换
var tmp = base64.Split(new string[] { "base64," }, StringSplitOptions.None);
if (tmp.Length == 2)
{
@base64 = @tmp[1];
}
byte[] bytes = Convert.FromBase64String(@base64);
using (MemoryStream ms = new MemoryStream(bytes))
{
//这一段的作用是解决图片资源占用gdi+错误
var tmp_bmp = new System.Drawing.Bitmap(ms);
var new_nmp = new Bitmap(tmp_bmp.Width, tmp_bmp.Height);
using (Graphics gdi = Graphics.FromImage(new_nmp))
{
gdi.DrawImage(tmp_bmp, 0, 0, tmp_bmp.Width, tmp_bmp.Height);
gdi.Dispose();
}
return new_nmp;
}
}
/// <summary>
/// 将图片转为byte数组
/// </summary>
/// <param name="bitmap">base64字符串</param>
public static byte[] ToBuffer(Bitmap bitmap)
{
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Jpeg);
return ms.ToArray();
}
}
/// <summary>
/// 将byte数组转为图片
/// </summary>
/// <param name="bitmap">base64字符串</param>
public static Bitmap ToImage(byte[] buffer)
{
using (MemoryStream ms = new MemoryStream(buffer))
{
//这一段的作用是解决图片资源占用gdi+错误
var tmp_bmp = new System.Drawing.Bitmap(ms);
var new_nmp = new Bitmap(tmp_bmp.Width, tmp_bmp.Height);
using (Graphics gdi = Graphics.FromImage(new_nmp))
{
gdi.DrawImage(tmp_bmp, 0, 0, tmp_bmp.Width, tmp_bmp.Height);
gdi.Dispose();
}
return new_nmp;
}
}