線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2718
推到 Plurk!
推到 Facebook!

有關thumbnial中使用imagelist的速度問題,請指導一下,謝謝。

答題得分者是:RootKit
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-26 17:49:36 IP:219.87.xxx.xxx 訂閱
請問各位,我使用listview加上imagelist的方式做thumbnail的功能,但是當圖片超過1000張以上(我測試時是1100張開始會變很慢)速度就會變很慢,已經有試過方式如下:
1 enable後,處理完再顯示
2 beginupdate/endupdate的方式
3 設定imagelist.allocby
以上三種方式是爬文後的方法,但是當超過1000張縮圖時,就會整個速度變慢,而測試過是在imagelist.add,或是使用replace也是一樣很慢,之前有找過google,好像有人提過這個問題,但是卻一直沒有後文,要實現此功能是因為同一個資料夾內可能會有超過1000張以上的影像,但是在使用檔案總管的icon卻不會這麼久,所以想請問一下,有沒有什麼別的方式可以改善這個方式,或是利用別的方式也可以達成此功能,另外有人提到用畫的方式畫在listview,但是因為我需的功能是要能直接對image做刪除的動作,所以不知能不能使用畫的(目前也沒研究),這個問題好像很多人都有遇到過,但好像沒什麼好方法,目前有找到使用vc寫的exe檔,可以達到跟檔案總管差不多的速度,但是在imagelist的add這段還有製作thumbnail的方式是以dll的方式提供,所以也無從解檔,但是知道應該是有辦法解決這個瓶頸,麻煩各位幫幫忙,指點一下方式,謝謝。
------
DELPHI初學者
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-06-30 21:09:42 IP:122.126.xxx.xxx 訂閱
可能是GDI資源的關係。因為建立太多的 Bitmap ,除非自行改良。
或轉成 ICON 可以避開這個問題。
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-01 09:13:15 IP:219.87.xxx.xxx 訂閱
不好意思,什麼是「GDI資源」,請問一下,我就是想問一下,如何自行改良的方法,因為我這個問題著實是要處理VC的,但我想先使用DELPHI測試,另外大大的意思是說,如果讀入到IMAGELIST是ICON的話,則超過一千張(我測試的結果)速度也不會降下來嗎?是這個意思嗎?謝謝你的回覆,這個問題在GOOGLE上很多人問,但好像都是卡在這個瓶頸,謝謝。

===================引 用 RootKit 文 章===================
可能是GDI資源的關係。因為建立太多的 Bitmap ,除非自行改良。
或轉成 ICON 可以避開這個問題。
------
DELPHI初學者
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-01 20:45:36 IP:122.126.xxx.xxx 訂閱
GDI 繪圖資源,可查一下。甚至在 Windows 9x 是有限的資源,若消耗過多的繪圖資源會導致當機。..
雖然在 Windows XP 解決了這個限制,不過在處理上仍然需要轉換。

載圖會變慢的原因,不外呼記憶體及GDI資源不足的原因。
若非得使用 TListView 我會建議自己繪製,不透過 ImageList 事先載圖。
改良方法:
1. 若要事先全部載入,可先儲存為 TJPEGIMAGE 。不佔繪圖資源。
2. 僅載入目前所見的縮圖。

以上方法都是透過 onCustomDrawItem 自己畫,
如果一定要用TImageList 事先載圖也要先轉成 ICON ,因為JPG&ICON 都是不佔繪圖資源的。
當然我會建議 1&2 同時都用,一來也不需擔心因檔案太多所導致記憶體不足的原因。
二來效率也會比較好。

參考
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-02 09:18:57 IP:219.87.xxx.xxx 訂閱
謝謝你的回覆,根據你提出的二點,我想再請教一下,因為我是要做類似檔案總管內的縮圖功能,基本上我的圖檔全都是bmp的圖檔,轉成jpg是沒問題,但是我需要能從listview上去編輯圖片(這個用在 onCustomDrawItem 也可以做成多選的功能嗎?),就是做刪檔的動作,如果user在軟體上刪檔後,還要立即將其它的圖片重畫(如果以大大的說話,使用畫的),這樣會不會還是會慢呢?因為我對畫的這部份不是相當了解,希望大大能再詳細指導一下,謝謝你了。

===================引 用 RootKit 文 章===================
GDI 繪圖資源,可查一下。甚至在 Windows 9x 是有限的資源,若消耗過多的繪圖資源會導致當機。..
雖然在 Windows XP 解決了這個限制,不過在處理上仍然需要轉換。

載圖會變慢的原因,不外呼記憶體及GDI資源不足的原因。
若非得使用 TListView 我會建議自己繪製,不透過 ImageList 事先載圖。
改良方法:
1. 若要事先全部載入,可先儲存為 TJPEGIMAGE 。不佔繪圖資源。
2. 僅載入目前所見的縮圖。

以上方法都是透過 onCustomDrawItem 自己畫,
如果一定要用TImageList 事先載圖也要先轉成 ICON ,因為JPG&ICON 都是不佔繪圖資源的。
當然我會建議 1&2 同時都用,一來也不需擔心因檔案太多所導致記憶體不足的原因。
二來效率也會比較好。

參考
------
DELPHI初學者
編輯記錄
macchen 重新編輯於 2009-07-02 09:21:02, 註解 2. 僅載入目前所見的縮圖(請問這個要如何判斷?使用者拉到那邊就先顯示那邊的圖檔)‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-07-02 20:57:44 IP:122.126.xxx.xxx 訂閱
自己畫的話,對複選判斷時多了一些繪圖上顯示的處理。

1. Bitmap & JPEG 在繪圖速度上,Bitmap 在顯示速度會快一些。但通常肉眼上是差距很小幾乎看不太出來。
2. 無論是 Bitmap或JPEG 再重畫上都需要。並不是用了Bitmap 就沒有了繪圖動作。

通常我們在畫布上 Canvas 作畫,Bitmap可以直接拿來作畫而JPEG 需要解碼後畫上去。
Bitmap 需要考慮 GDI 資源的問題,而JPEG 需要考慮的是記憶體的問題。

畫整個畫面是非常快的。
主要還是載圖的方式,若使用我之前所提出的第二點,就不要再轉成 JPEG了。
第二點的困難點在於需要接收 ScrollBar (上一頁,下一頁)的訊息(這方面需要利用繼承元件的方式)。
邏輯上需要好好想一想,如何處理。

我之前有寫過類似的東西,不過不是使用 ListView。
理念上先規劃一個畫面上有幾個縮圖,搭配 TScrollBar 當拉動捲軸時重新讀取該位置圖檔的內容。
因此每次需要幾個 Tbitmap 既使有幾千個檔案,資源的使用都是一樣的。

參考
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-07-03 13:43:48 IP:219.87.xxx.xxx 訂閱
先謝謝你的回覆,不好意思,我想說一下是不是我有誤會你的意思,你的意思是說,如果我的圖檔是bmp,而如果要做成縮圖的話,我的mem是夠大,所以我可以考慮使用jpg的方式來畫,而畫的時候,是不是就不能使用listview了,因為我不知畫的時候,它還有沒有scrollbar了,所以我會用panel加上tscrollbar,另外再請問一下,如果我要用你說的上述第二點:「看的到的地方才畫」,是不是指要使用thread的方式才可以實現?那看不到的地方是不是也要慢慢畫?可否請大大提供之前你的例子給我參考,麻煩大大了,謝謝,或是再指導一下小弟,謝謝你。

===================引 用 RootKit 文 章===================
自己畫的話,對複選判斷時多了一些繪圖上顯示的處理。

1. Bitmap & JPEG 在繪圖速度上,Bitmap 在顯示速度會快一些。但通常肉眼上是差距很小幾乎看不太出來。
2. 無論是 Bitmap或JPEG 再重畫上都需要。並不是用了Bitmap 就沒有了繪圖動作。

通常我們在畫布上 Canvas 作畫,Bitmap可以直接拿來作畫而JPEG 需要解碼後畫上去。
Bitmap 需要考慮 GDI 資源的問題,而JPEG 需要考慮的是記憶體的問題。

畫整個畫面是非常快的。
主要還是載圖的方式,若使用我之前所提出的第二點,就不要再轉成 JPEG了。
第二點的困難點在於需要接收 ScrollBar (上一頁,下一頁)的訊息(這方面需要利用繼承元件的方式)。
邏輯上需要好好想一想,如何處理。

我之前有寫過類似的東西,不過不是使用 ListView。
理念上先規劃一個畫面上有幾個縮圖,搭配 TScrollBar 當拉動捲軸時重新讀取該位置圖檔的內容。
因此每次需要幾個 Tbitmap 既使有幾千個檔案,資源的使用都是一樣的。

參考
------
DELPHI初學者
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-07-04 12:50:26 IP:125.225.xxx.xxx 未訂閱
Retrieving IExtractImage interface pointer from Windows Shell folder
http://www.delphi3000.com/articles/article_3806.asp?SK=
或許可以試試這個IExtractImage,windows就是用這個來產生檔案總管的縮圖
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-07-06 14:21:38 IP:219.87.xxx.xxx 訂閱
你好,非常謝謝你的回覆,這個測試起來好像沒有比較快呢?而且它不像window會在所看見的地方先執行縮圖的動作,而且速度好像沒有比較快,它會先取得icon,然後再做顯示的動作,好像沒有比較快速呢?請大大再指教一下,謝謝,我再看看程式碼的部份是不是可以直接修改,另外根據上面大大的回覆,好像用畫的比較快的樣子?還沒測試中,請各位大大再指導一下小弟,謝謝。

===================引 用 bugmans 文 章===================
Retrieving IExtractImage interface pointer from Windows Shell folder
http://www.delphi3000.com/articles/article_3806.asp?SK=
或許可以試試這個IExtractImage,windows就是用這個來產生檔案總管的縮圖
------
DELPHI初學者
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-07-06 21:13:23 IP:122.126.xxx.xxx 訂閱
講過了。如果一次將全部圖片載入無論用任何方法一定會非常慢的。
這個改善原理跟DBGrid BufferCount &RowCount 有點像。

ACDSEE 肯定也沒那麼呆。

該說的都說了,只剩下實作了。
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-07-07 17:26:20 IP:219.87.xxx.xxx 訂閱
謝謝你的回覆,如果可以的話,方便給個範例嗎?我先將此帖先結了,等完成功能後再上傳分享結果,謝謝你的回覆。
===================引 用 RootKit 文 章===================
講過了。如果一次將全部圖片載入無論用任何方法一定會非常慢的。
這個改善原理跟DBGrid BufferCount &RowCount 有點像。

ACDSEE 肯定也沒那麼呆。

該說的都說了,只剩下實作了。
------
DELPHI初學者
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-07-09 22:34:35 IP:125.225.xxx.xxx 未訂閱
剛才找到的Thumbnails Viewer using ListCtrl
http://www.codeproject.com/KB/combobox/ThumbsViewer.aspx
我直接下載demo project,產生縮圖的速度很快,應該符合你的需求
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-07-10 13:21:44 IP:219.87.xxx.xxx 訂閱
非常謝謝你啦,這個速度真的很快呢,目前在研究他的寫法,有什麼不同的地方,謝謝你的分享,如果研究成功再改成delphi的版本,謝謝分享了。
===================引 用 bugmans 文 章===================
剛才找到的Thumbnails Viewer using ListCtrl
http://www.codeproject.com/KB/combobox/ThumbsViewer.aspx
我直接下載demo project,產生縮圖的速度很快,應該符合你的需求
------
DELPHI初學者
編輯記錄
macchen 重新編輯於 2009-07-10 13:25:24, 註解 他內部好像會用到ximage的東西呢?這個沒source code可下,x64就不能build了‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-07-15 22:06:45 IP:122.126.xxx.xxx 訂閱
提不起寫這程式的興趣。
路過給點參考。.....

大略看了一下那個範例,他是用 Thread 方式。
原則上跟之前貼的 Delphi 寫法不會差很多。

差別在拿到 Thread 中執行,利用 Thread 一邊載入處理一邊顯示出來。
因為 Thread 關係不會影響操作,畫面上會一下子 Show出來,實際上它還是都在背景處理載入全部的圖檔。

這個方法若很多檔案不適合在 Win 9x 下執行或者真正檔案很多的時候,還是會造成記憶體不足的問題。
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-07-16 13:07:27 IP:219.87.xxx.xxx 訂閱
非常謝謝RootKit的回覆,就是只用那個範例仍不夠快速顯示,所以還是需要靠自已繪的方式嗎?我還在想別的方法,看有沒有辦法從上例中去改,可以讓它一個一個畫,謝謝回覆,請問一下,大大有提到「原則上跟之前貼的 Delphi 寫法不會差很多。」,這句話指的是處理listview看的到的地方的物件改寫嗎?因為對delphi的物件修改仍不是很熟,希望大大有機會路過再指導我一下,謝謝你。

===================引 用 RootKit 文 章===================
提不起寫這程式的興趣。
路過給點參考。.....

大略看了一下那個範例,他是用 Thread 方式。
原則上跟之前貼的 Delphi 寫法不會差很多。

差別在拿到 Thread 中執行,利用 Thread 一邊載入處理一邊顯示出來。
因為 Thread 關係不會影響操作,畫面上會一下子 Show出來,實際上它還是都在背景處理載入全部的圖檔。

這個方法若很多檔案不適合在 Win 9x 下執行或者真正檔案很多的時候,還是會造成記憶體不足的問題。
------
DELPHI初學者
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-07-23 20:28:37 IP:122.126.xxx.xxx 訂閱
不是,是之前有人發表的。
如果仍對這個主題有興趣,我有空在做各範例。

===================引 用 macchen 文 章===================
非常謝謝RootKit的回覆,就是只用那個範例仍不夠快速顯示,所以還是需要靠自已繪的方式嗎?我還在想別的方法,看有沒有辦法從上例中去改,可以讓它一個一個畫,謝謝回覆,請問一下,大大有提到「原則上跟之前貼的 Delphi 寫法不會差很多。」,這句話指的是處理listview看的到的地方的物件改寫嗎?因為對delphi的物件修改仍不是很熟,希望大大有機會路過再指導我一下,謝謝你。

===================引 用 RootKit 文 章===================
提不起寫這程式的興趣。
路過給點參考。.....

大略看了一下那個範例,他是用 Thread 方式。
原則上跟之前貼的 Delphi 寫法不會差很多。

差別在拿到 Thread 中執行,利用 Thread 一邊載入處理一邊顯示出來。
因為 Thread 關係不會影響操作,畫面上會一下子 Show出來,實際上它還是都在背景處理載入全部的圖檔。

這個方法若很多檔案不適合在 Win 9x 下執行或者真正檔案很多的時候,還是會造成記憶體不足的問題。
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-07-27 14:33:21 IP:219.87.xxx.xxx 訂閱
非常感謝RootKit大大仍有注意到這篇,如果大大有空的話,小弟仍希望大大能做個範例,畢竟小弟程式方面並不是相當的專精,而且基本上並不是程式完成即可,而還要要求速度的情況下,需考慮的東西可能就比較多了,謝謝,如果有範例,相信對站上的人有需要處理此問題的人也會有幫助,畢竟要改寫vcl如果沒有硬底子的人應該不是很容易下手(小弟我就是這樣子的人,硬著頭皮試著做做看而已),謝謝大大的回覆。

===================引 用 RootKit 文 章===================
不是,是之前有人發表的。
如果仍對這個主題有興趣,我有空在做各範例。
------
DELPHI初學者
系統時間:2024-04-18 20:14:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!