2012-02-03 120 views
2

現在我有一個應用程序,將一堆縮略圖加載到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(); 

回答

1

GDI +其中伏於圖像類別要求的源數據流保持開放,而圖像中存在的正常工作。在Image使用它時將更改寫入源流也是一個好主意。更改應保存到不同的流中。

從Image派生的所有東西都使用了封面下的Stream。他們的加載行爲是相同的。

圖像不關閉或處置,將其通過FromStream提供給它的流。你必須自己管理。

此外,要求一個流沖洗只有當流已經寫入的效果。

如果你正在尋找改善你的PictureBoxes UI行爲,試試這個:

  1. 設置InitialImage一個小微調GIF。
  2. 將WaitOnLoad設置爲false。
  3. 通過設置ImageLocation指定圖像。 (您可以使用文件規格或其中的URL。)
  4. 使用LoadAsync方法異步加載圖像。
0

1)

如果一個位圖對內存流或文件流的依賴,將 進行處置,當你處理它的來源?或者這隻有當它 它使用Bitmap.FromFile創建流本身?

在​​看看:

你必須保持流打開圖像的壽命。

2)

在PictureBox必須緩存以某種方式圖像。我從未有過 的錯誤,因爲一旦設置完成後我不需要觸摸圖像。

你剛纔應該不是因爲(在使用它,即圖片框),它已被分配給圖片框處置Image實例和,而圖片框使用它。否則,PictureBox將嘗試使用已處理的圖像,並且會導致一些「不好」的後果。

PictureBox.Image Property

注意:如果你想使用相同的圖像多的PictureBox控件 ,爲每個圖片框圖像的克隆。訪問 來自多個控件的相同圖像會導致發生異常。

更新:

樣品具有幾乎相同的場景:HOW TO: Copy a Picture from a Database Directly to a PictureBox Control with Visual C#

+0

你從我的測試看我的結果嗎?我處理了用於Image.FromStream的流,但我的PictureBox控件仍然很好地繪製。我只是想弄清楚爲什麼會發生這種情況,以便更好地理解如何從PictureBoxes獲得最佳性能。 – 2012-02-03 19:20:26

+0

@Moozhe,我想,MemoryStream Dispose()實際上並沒有**配置內存,因爲MemoryStream實現:它使用簡單的字節數組(它將被垃圾收集)。你可以試試FileStream類的實驗嗎? – 2012-02-03 19:25:17

+0

這聽起來是正確的,因爲MemoryStream沒有分配內存...... PictureBox必須持有對byte []數組內存地址的引用,這就是爲什麼它沒有被垃圾收集。 – 2012-02-03 19:36:39

相關問題