Изображение в байт [] зависает на неопределенный срок

#c# #arrays #image #memorystream

#c# #массивы #изображение #memorystream

Вопрос:

 var originalImageBytes = originalFile.FileBytes();

// Convert bytes to image
Image originalImage;
using (var ms = new MemoryStream(originalImageBytes))
{
    originalImage = Image.FromStream(ms);
}

// Convert back to byte array
using (var ms = new MemoryStream())
{
    originalImage.Save(ms, ImageFormat.Png);
    return ms.ToArray();
}
  

Возврат originalImageBytes в любой момент работает нормально, однако программа зависает на неопределенный срок в последней return ms.ToArray() строке.

Почему это ms.ToArray() вызывает зависание?

Ответ №1:

Это может быть связано с каким-то странным поведением при Image использовании a Stream . Вы должны держать поток открытым до тех пор, пока не закончите с изображением, поскольку Image можете загружать содержимое по желанию.

Возможно, что Save на самом деле запускает чтение (затем) закрытого и удаляемого MemoryStream . Попробуйте посмотреть, что произойдет, если вы не закроете поток.

Комментарии:

1. Спасибо, вы правы. Если я изменю первый блок Bitmap originalImage; using (var ms = new MemoryStream(originalImageBytes)) { originalImage = new Bitmap(Image.FromStream(ms)); } , он будет работать нормально.

2. Для всех, кто еще читает это, не выполняйте приведенный выше код! Я думаю, что сборщик мусора .net возится с этим, и вы получаете странное поведение даже при создании растрового объекта из объекта изображения. Сохранение потока памяти исходного изображения открытым для всего метода — единственное, что работает должным образом.

3. Это потому, что изображение сильно зависит от дескрипторов Windows. Закрытие потока памяти очищает блок памяти, на который он ссылается.