現在我有一個應用程序,將一堆縮略圖加載到PictureBox控件中。有時超過一百次。這些圖像是使用Image.FromStream(MemoryStream)創建的,而內存流代表每個JPG文件。圖像加載和流/文件依賴
目前,只要我調用Image.FromStream,我將引用分配給圖片框,然後在I Flush()和Dispose()之後立即分配流。
根據文檔,我不應該釋放流,直到我完成了圖像。但是,我沒有這樣做過任何錯誤。我的PictureBox控件甚至可以在內存流很長時間處理後,使用縮略圖圖像整天重新繪製自己。
但是,如果我嘗試以任何方式訪問這些圖像,例如調用Save函數,則會引發錯誤。
如果一個位圖對內存流或文件流的依賴,這將部署在處置它的來源?或者僅當它使用Bitmap.FromFile創建流本身時?
正在處理MemoryStream,就像我正在考慮的那樣好嗎? PictureBox必須以某種方式緩存圖像。我從來沒有發生錯誤,因爲一旦設置好了,我就不需要觸摸圖像。
我還注意到,它需要我的PictureBoxes很長時間來繪製他們的父控制。我不確定這是因爲我有太多的控件,或者是第一次在PictureBox中繪製圖像時出現延遲。
我知道當你用一個文件參數創建一個新的位圖時,它實際上並沒有加載文件內容,直到第一次需要。我的問題是,我不希望每個OnPaint操作都被文件讀取延遲,我想確保在我嘗試繪製控件之前預加載數據,否則會出現閃爍和緩慢的繪製。
是否有強制圖像被預加載的好方法? Image.FromFile,Image.FromStream,新的Bitmap(fileName)等之間有什麼不一致?是否所有這些都會立即加載所有字節,還是延遲到第一次需要時爲止?
這裏是我的代碼:
MemoryStream ms = new MemoryStream(bytes); // byte[] array
pictureBox.Image = Image.FromStream(ms);
ms.Flush();
ms.Dispose();
你從我的測試看我的結果嗎?我處理了用於Image.FromStream的流,但我的PictureBox控件仍然很好地繪製。我只是想弄清楚爲什麼會發生這種情況,以便更好地理解如何從PictureBoxes獲得最佳性能。 – 2012-02-03 19:20:26
@Moozhe,我想,MemoryStream Dispose()實際上並沒有**配置內存,因爲MemoryStream實現:它使用簡單的字節數組(它將被垃圾收集)。你可以試試FileStream類的實驗嗎? – 2012-02-03 19:25:17
這聽起來是正確的,因爲MemoryStream沒有分配內存...... PictureBox必須持有對byte []數組內存地址的引用,這就是爲什麼它沒有被垃圾收集。 – 2012-02-03 19:36:39