需求: 序列化图片数据时,提示: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