2016-10-04 120 views
3
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()线。图片为byte []无限期挂起

为什么ms.ToArray()会造成挂起?

回答

3

这可能与Image使用Stream的一些奇怪行为有关。你have to keep open the stream,直到你完成了图像,因为Image可以随意延迟加载内容。

有可能Save实际上触发读取(然后)关闭和处置MemoryStream。试着看看如果你不关闭流会发生什么。

+1

谢谢,你说得对。如果我将第一个块更改为'Bitmap originalImage;使用(var ms = new MemoryStream(originalImageBytes)) originalImage = new Bitmap(Image.FromStream(ms)); '它工作正常。 –

+1

对于阅读此内容的其他人,请勿执行上述代码!我认为.net垃圾回收器会与它混淆,即使从Image对象创建Bitmap对象,您也会得到奇怪的行为。保持原始图像内存流为整个方法打开是唯一正常工作的。 –

+0

这是因为图像严重依赖于Windows的句柄。关闭内存流会清除它引用的内存块。 –

相关问题