System.OutOfMemoryException при создании кисти из байтового массива изображения - PullRequest
0 голосов
/ 08 января 2019

Мне иногда нужно загрузить изображение из байтового массива следующим образом:

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 голосов
/ 10 января 2019

Удалите оператор using из MemoryStream.

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);
}
...