.net序列化对象将Bitmap转字节数组,转base64报错GDI+中发生一般性错误的解决办法

需求: 序列化图片数据时,提示:GDI+中发生一般性错误

原始代码:

[Serializable]
public class DrawImage : DrawObject
{
        private Bitmap _image;
        public Bitmap TheImage{get { return _image; }}

	[JsonProperty]
	public String ImageData
	{
		get
		{
			String base64 = String.Empty;
			if (TheImage != null)
			{
				MemoryStream stream = new MemoryStream();
				TheImage.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
				byte[] bytes = stream.ToArray();
				stream.Close();
				base64 = Convert.ToBase64String(bytes);
			}
			return base64;
		}
	}
}

 DrawImage 是我需要序列化储存的对象,_image定义实际储存的位图数据,为了保存数据定义了String 类型的ImageData;在编写代码时受java编程习惯的影响,直接拿此对象的成员变量TheImage来用,结果提示:GDI+中发生一般性错误

错误原因网上博客大同小异,和Image对象声明周期有关,然而重要的是如何解决问题,下面贴出我的解决方案;

重点是使用using关键字将Image和Stream及时地释放掉

[Serializable]
public class DrawImage : DrawObject
{
        private Bitmap _image;
        public Bitmap TheImage{get { return _image; }}

	[JsonProperty]
	public String ImageData
	{
		get
			{
				String base64 = String.Empty;
				try
				{
					if (TheImage != null)
					{
						using (Bitmap img = new Bitmap(TheImage))
						{
							using (MemoryStream stream = new MemoryStream())
							{
								img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
								byte[] bytes = stream.ToArray();
								base64 = Convert.ToBase64String(bytes);
								stream.Close();
							}

							img.Dispose();
						}
					}
				}
				catch (Exception e)
				{
					throw;
				}
				return base64;
			}
	}
}

the end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值