#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. Закрытие потока памяти очищает блок памяти, на который он ссылается.