在我的程序中的某个时刻,用户选择一个位图作为Panel对象的背景图像。当用户执行此操作时,程序会立即使用背景图像绘制面板,一切正常。当用户单击" Save"时,以下代码将位图保存到DataTable对象。
MyDataSet.MyDataTableRow myDataRow = MyDataSet.MyDataTableRow.NewMyDataTableRow(); //has a byte[] column named BackgroundImageByteArray
using (MemoryStream stream = new MemoryStream())
{
this.Panel.BackgroundImage.Save(stream, ImageFormat.Bmp);
myDataRow.BackgroundImageByteArray = stream.ToArray();
}
一切正常,此流没有内存不足异常,即使它包含所有图像字节。但是,当应用程序启动并加载已保存的数据时,以下代码会引发内存不足异常:
using (MemoryStream stream = new MemoryStream(myDataRow.BackGroundImageByteArray))
{
this.Panel.BackgroundImage = Image.FromStream(stream);
}
流的长度相同。我不明白如何抛出一个内存不足的异常而另一个没有。如何加载此位图?
P.S。我也试过了
using (MemoryStream stream = new MemoryStream(myDataRow.BackgroundImageByteArray.Length))
{
stream.Write(myDataRow.BackgroundImageByteArray, 0, myDataRow.BackgroundImageByteArray.Length); //throw OoM exception here.
}
答案 0 :(得分:0)
我认为这个问题在这里:
myDataRow.BackgroundImageByteArray = stream.ToArray();
Stream.ToArray()。请注意,这会将流转换为长度= stream.Length的字节数组。 Stream.Legnth是流的缓冲区大小,它将大于加载到其中的实际数据。您可以在Stream.ReadByte()
循环中使用while
来解决此问题,直到它返回-1,表示流中数据的结束。
答案 1 :(得分:0)
你可以看看这个库。
http://arraysegments.codeplex.com/
项目说明
ArraySegment的轻量级扩展方法,对字节数组特别有用。
支持.NET 4.0(客户端和完整版),.NET 4.5,Metro / WinRT,Silverlight 4和5,Windows Phone 7和7.5,所有可移植库配置文件和XBox。