2016-10-04 98 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的句柄。關閉內存流會清除它引用的內存塊。 –