[問題] 撰寫"開啟檔案"功能時縮圖的問題

作者: googled (15357)   2014-04-29 21:09:10
不好意思,小弟目前再用Qt寫一程式時,
因為XP系統的開啟檔案似乎沒辦法預設就是縮圖模式
如圖:

必須要從紅圈處改成縮圖才可以
所以必須要寫一個開檔功能應用在XP上 (老闆堅持用XP...)
目前已經做到可以在List上顯示該目錄下的所有檔案類型
如圖:

但對於縮圖的實做上有些問題想請教
目前置作縮圖的方法是將目錄上的所有檔案都過濾,
只顯示屬於圖檔的部分,接著去讀取每一張圖,然後呼叫函式縮小
最後再放到List上,但這樣有一個問題是每前進一個目錄
我的程式都會Delay直到該目錄下所有圖片都縮完並顯示為止
如果圖片有20張,我程式大概會有2~3秒不能動
本來想說用執行緒的方式去實作,還沒縮完的圖檔都用系統預設的Icon
縮完一張圖片在更新一個ListItem,像這個樣子


可是還沒去實作就又想到一個問題,就是當圖片過大時,
開檔並縮小的時間就越長,可是看了一下Win7的縮圖功能,卻都是神之快
不管我圖片在大,每當進入資料夾後,系統製作縮圖的速度真的超迅速
而且我程式在進行縮圖的過程中,程式記憶體會標很高,
甚至很容易出現"記憶體不足"的錯誤,
但看了一下系統管理員卻還有好幾G的記憶體可用,也滿莫名其妙的
所以又感覺自己的方向不對,想請教一下各位高手,
能否給小弟一點方向、建議或提示,該怎麼做才可以快速產生縮圖
還是說有辦法直接去讀取XP、win7系統中該圖片的thumbnail cache
或者XP有辦法調成預設開啟檔案就是縮圖模式ˇ_ˇ
謝謝各位
作者: LiloHuang (十年一刻)   2014-04-29 21:16:00
Windows 的縮圖快取可以透過 IExtractImage 來獲得這篇雖不是 C++ 的範例 http://goo.gl/N7RLlz 仍可參考至於記憶體不足,除了 memory leak 有些該釋放沒釋放還有一種可能就是圖片太大,難以配置到連續的記憶體空間至於讓 XP 直接顯示 thumbnail view 應該沒直接的方式倒是這兒有一篇文章提到,有一些特殊技巧可以辦到 :Phttp://goo.gl/lm3hnw 自己 SendMessage 給 dialog 囉SendMessage(hWnd, WM_COMMAND, ODM_VIEW_THUMBS, 0);還有如果自己 decode 會卡住,是因為 UI thread 被卡住會卡 UI 的任務,都該放到 worker thread 非同步執行待任務完成之後,再通知 UI thread 更新畫面之類的雖然我沒有真的測試,但根據 MSDN 那篇文章的描述SendMessage 在特定情況才會成功,其他狀況會失敗可能要做一下 Hook 在 init dialog 時,送 PostMessage給 FileDialog 自己,然後再該時機點去改變排序的類型觀察記憶體用量請用 procexp.exe http://goo.gl/n7utTE搭配下 debug break point 來幫助自己釐清哪些階段增加procexp 使用時,請直接針對你的 process 點兩下來觀察如果可以直接改 dialog 排序達成目的當然是最快其次是 IExtractImage 這方法得懂一些 COM 操作自己 decode 圖片,除非是特殊需求 (如要顯示 RAW 檔)不然寫的好可是不簡單的任務... 大概是這樣 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com