从图像字节数组创建画笔时发生System.OutOfMemoryException

时间:2019-01-08 04:58:21

标签: .net drawing gdi+

有时我需要从字节数组中加载图像,如下所示:

Bitmap image = null;

using (var ms = new MemoryStream(File.ReadAllBytes(sourceImagePath)))
{
    image = (Bitmap)Image.FromStream(ms);
}

现在我需要根据该图像创建一个TextureBrush,所以我使用以下方法:

using (var b = new TextureBrush(image))
{

}

它抛出System.OutOfMemoryException: 'Out of memory.'。经过一段时间的试验,我发现如果使用Image.FromFile可以像这样创建画笔:

using (var b = new TextureBrush(Image.FromFile(sourceImagePath)))
{

}

为简便起见,我将不介绍为什么我不想使用此方法的原因,因此谁能在第一个示例中向我展示如何使用字节数组方法?

1 个答案:

答案 0 :(得分:3)

删除MemoryStream上的using语句。

1)MemoryStream不会占用任何系统资源,因此无需处理它们。您只需关闭流。

2)使用Image.FromStream时,必须使流保持打开状态。请参阅https://docs.microsoft.com/en-us/dotnet/api/system.drawing.image.fromstream?view=netframework-4.7.2上的备注部分:

  

备注

     

您必须在图像的生命周期内保持流打开。

另一种选择是复制位图,如下所示:

using (var ms = new MemoryStream(File.ReadAllBytes(sourceImagePath)))
using (var bmp = (Bitmap)Image.FromStream(ms))
{
    image = new Bitmap(bmp);
}