2010-11-15 66 views
2

我開發了一個應用程序,我想用一系列圖像顯示網格。對於每個圖像,我創建一個類myImage的實例。 MyImage類擴展了JCompoment並創建了一個縮略圖,並在繪製之後用paintCompoment(Graphics g)繪製。Java2d縮略圖。我可以從操作系統獲得縮略圖嗎?

一切都好,但在大尺寸圖像中,我有很多延遲來創建縮略圖。

現在我想到當我掃描圖像的文件夾(創建我上面所說的列表來創建每個圖像的縮略圖並將其保存到光盤。對於每個圖像,我將有一個數據庫記錄來保存圖像路徑所以這是一個很好的解決問題的方法嗎? 有沒有辦法讓系統爲每個圖像創建縮略圖,在文件管理器中,還是比我嘗試的更有效的解決方案

謝謝!!

+0

你在說哪個系統?在Gnome中,它似乎存儲在'〜/ .thumbnails/normal /'md5sum $ file'.png'中(雖然'md5sum'只是一個簡單的猜測:) – Kevin 2010-11-15 17:43:03

+0

謝謝Kevin for you的回答!是的,現在我在gnome中開發,但我想部署應用程序和Windows。是的,我在該目錄中找到了許多縮略圖。如果您知道目錄中包含我的電腦上的所有媒體文件的縮略圖,或者我至少應該放一次,請使用nautilus打開圖像文件,以創建縮略圖。還有一個文件夾在Windows(XP,Vista,7),所以根據OS Linux系統與GNOME或Windows來創建我的應用程序的2個單獨的實例或從適當的文件夾中獲取縮略圖。再次感謝。 – javment 2010-11-15 20:13:32

回答

2

最好的辦法是使用類似imagemagick的東西來轉換圖像並創建縮略圖。有一個項目叫JMagick,它提供了Imag的JNI鉤子emagick,但也運行一個流程工作。

Imagemagick是經過大量優化的用於處理圖像的C代碼。它也能夠處理Java不支持的圖像以及更少的內存使用量。

我在一個網站上工作,我們讓用戶上傳藝術作品並快速創建縮略圖,而且它絕對需要快速,所以這就是我們所使用的。

下面是Groovy代碼,但它可以修改爲Java代碼很容易地:

public boolean createThumbnail(InputStream input, OutputStream output){   

    def cmd = "convert -colorspace RGB -auto-orient -thumbnail 125x125 -[0] jpg:-" 

    Process p = cmd.execute() 
    p.consumeProcessErrorStream(System.out) 
    p.consumeProcessOutputStream(output) 
    p.out << input 
    p.out.close() 

    p.waitForOrKill(8000) 
    return p.exitValue()==0 
} 

這將創建使用管道沒有任何數據實際寫入磁盤的縮略圖。如果您想立即寫入,outputStream可以是一個文件。

+0

注意:如果您計劃發佈到Windows,則需要使用JMagick而不是控制檯應用程序。它也應該更快。 – 2010-11-15 20:16:09

+0

+1有趣的想法;你能否評論依賴性負擔? – trashgod 2010-11-15 21:30:24

+0

謝謝,是的,我會嘗試使用JMagic,並檢查縮略圖創建時的延遲是否比我的Java代碼少。 – javment 2010-11-15 22:23:40

1

避免OS依賴的一種方法是使用getScaledInstance(),如此example所示。有關某些限制,請參閱cited articles。如果時間過長,請使用SwingWorker在後臺執行加載和縮放。

+0

謝謝。我更改我的代碼以創建拇指,使用getScaledInstance(),但在加載一些照片後,出現內存錯誤。我將學習SwingWorker。在下面的答案中,您對「+1有趣的想法有什麼意義;您可以評論依賴性負擔嗎?」 – javment 2010-11-15 22:28:14

+0

內存錯誤表明您可能無意中保留了對象。依賴性負擔是維護和部署每個目標OS的第三方應用程序所需的努力。 – trashgod 2010-11-16 02:32:18

0

我還沒有使用它來創建縮略圖,但您可能還想看看ImageIO API。

ImageIO

+0

謝謝,這已經是我用來創建縮略圖了。我會嘗試米蘭Ramaiya的建議jMagick,試圖縮短縮略圖的創建時間。 – javment 2010-11-27 08:37:12