簡體   English   中英

c#中大量圖片顯示為縮略圖的最佳實踐

[英]Best practices for displaying large number of images as thumbnails in c#

我已經到了很難通過調試和跟蹤對象獲得答案的地步,所以我需要一些幫助。

我想做的是:我的屏幕捕獲寵物項目的歷史記錄表。 歷史記錄必須將所有圖像列為縮略圖(例如:picasa)。

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

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

問題:當我吃歷史表單時,流布局面板填充了我的 HistoryItem 自定義控件,我的 memory 使用量急劇增加。加載 100 張圖像時,從 14Mb 到大約 100MB。 通過關閉歷史表單並處理我可以處理的任何內容,甚至嘗試調用 GC.Collect() memory 增加仍然存在。 我搜索任何無法像圖像或事件那樣正確處理的 object,但無論我在哪里使用它們,它們都會被處理掉。 問題接縫來自多個來源。 一是冒泡的事件沒有處理好,二是圖片框本身。 當僅加載沒有任何圖像處理甚至事件的自定義控件時,我可以通過將所有代碼注釋為有限版本來看到所有這些。 如果沒有這些事件,memory 的消耗將減少 20%。


所以我真正的問題是這種邏輯、流布局面板和帶有圖片框的自定義控件是否是將大量圖像顯示為縮略圖的最佳解決方案。

謝謝!

我曾經這樣做過,當涉及到 memory 管理時,這很糟糕。 例如,您面臨着越來越多的 GDI 句柄的風險(例如,如果每個控件都創建 Font 或其他 GDI object 實例)並且此問題無法使用 GC.Collect() 解決。

我在 ComponentOwl.com 工作,我們開發了一個名為Better Thumbnail Browser的管理圖像縮略圖的控件,它還可以為您加載、調整大小和緩存縮略圖:

更好的縮略圖瀏覽器概述

他們還有一個名為Better ListView Express的免費組件,它仍然對圖像縮略圖有很好的支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM