2012-04-05 30 views
1

我得到了一個很難通過調試和跟蹤對象獲得答案的點,所以我需要一些幫助。在c中顯示大量圖像的縮略圖的最佳做法

我在做什麼: 我的屏幕捕捉寵物項目的歷史表單。歷史記錄必須將所有圖像列爲縮略圖(例如:picasa)。

我做了什麼: 我創建了一個HistoryItem:UserControl。 這個歷史項目有幾個按鈕,一個複選框,一個標籤和一個圖片框。這些按鈕用於刪除/編輯/複製圖像。該複選框用於選擇一個或多個圖像,標籤用於某些信息文本。圖片框從一個公共屬性獲取圖像,該屬性是一個路徑,並且一個方法創建一個比例縮略圖以在控件加載時顯示它。這個用戶控件有兩個公共事件。一個用於刪除圖像,另一個用於冒泡鼠標輸入事件和鼠標離開所有控件。爲此,我使用EventBroadcastProvider。冒泡是有用的,因爲無論我將鼠標移動到控件上,都會出現按鈕。 dispose方法已被擴展,我手動刪除事件。

所有圖像都是通過循環包含所有圖像路徑的xml文件加載的。對於這個XML中的每個圖像,我創建一個新的HitoryItem,添加到一個流佈局面板中(稍加編碼以排序和限制加載的圖像數量)。

問題: 當我吃午飯的歷史形式,和流佈局面板填充我HistoryItem自定義控件,我的內存使用量增加drastically.From 14MB左右被裝載100張圖像100MB。通過關閉歷史表單並處置任何我可以處理的內容,甚至嘗試調用GC.Collect(),內存增加仍然存在。我搜索任何不能像圖像或事件一樣妥善處理的物體,但是無論我在哪裏使用它們,都會被丟棄。問題來自多個來源。一個是冒泡事件沒有妥善處置,另一個來自圖片盒本身。所有這些我都可以通過將所有代碼評論到有限版本來看到,只有沒有任何圖像處理甚至事件的自定義控件被加載。如果沒有這些事件,內存消耗會按公理降低20%。


所以我真正的問題是,如果這樣的邏輯,流佈局面板和自定義控件與圖片框,用於顯示大量圖片以縮略圖的最佳解決方案。

謝謝!

+0

我不知道WinForms,但在WPF中,我會嘗試GridView ListView並綁定到List HistoryItem並使用觸發器打開和關閉按鈕。 – Paparazzi 2012-04-05 17:40:26

+0

你是如何製作縮略圖的? – 2012-04-05 17:42:38

+0

請記住,我刪除了代碼的一部分,並且問題依然存在。縮略圖在自定義控件的繪製事件中創建,並加載到picturebox.Image屬性中。只有在圖像尚未加載的情況下,paint方法中的代碼纔會運行。爲了生成縮略圖,我使用GetThumbnailImage方法。 – andySF 2012-04-05 17:54:17

回答

1

我曾經做過這件事,當談到內存管理時,它是非常糟糕的。例如,您冒着越來越多的GDI句柄的風險(例如,如果每個控件都創建Font或其他GDI對象實例),並且GC.Collect()無法解決此問題。

我的ComponentOwl.com工作,我們已經開發了一種名爲Better Thumbnail Browser管理圖像縮略圖控制也可以做裝載,調整大小和緩存縮略圖您:

Better Thumbnail Browser Overview

他們也有一個免費的組件稱爲Better ListView Express,它仍然有很大的支持圖像縮略圖。