2013-10-05 42 views
0

我需要根據需要調整大小(並銳化和旋轉)一些圖像以創建各種分辨率。我有一臺小型開發電腦(Ivy Celeron @ 2.6GHz)。我的小測試圖片採用了640萬像素(分辨率)和4兆像素版本的可愛小貓咪圖片,並將兩個版本都縮小到750 x 400(目標尺寸)。圖像調整大小與GraphicsMagick與Java真的很慢嗎?

一個版本使用JavaIO + ImgScalr,另一個使用Graphics Magick + im4java

4百萬像素版本每張圖片使用原生JavaIO + scalr需要270ms,GraphicsMagick需要360ms。 64兆像素圖片需要3100ms才能使用JavaIO + scalr調整大小,而使用GraphicsMagick則需要4300ms。

我在這裏錯過了什麼。大多數時間是打開和讀取文件並保存結果的花費,但使用GraphicsMagick進行縮放的速度要慢得多。我知道這些與一些更高級算法的用戶有關,但最終結果看起來在兩個版本中都非常好,但我也沒有想到我的2013計算機每秒不能處理至少1000張圖像,但幾乎沒有每秒3到3張圖片。

所以問題是,我做錯了什麼?你有什麼措施調整圖像大小?我真的需要整個服務器來處理每秒10張圖片嗎?

**更新**:

做一些數學:64M /3秒= 20M /秒/ 2.6GHz的= 10Mio /千兆赫= 1像素/ 100時鐘週期。所以它接縫幾乎可以。對於4M我們有:3M /.3sec = 9M/sec = 1pix/200個週期。

因此,這裏有一個更新的問題:是否有一種格式,可能sacrefies內存,以便快速加載圖像?由於SSD速度較慢(64M * 3 = 192MB,4M * 3 = 12MB),因此最好是原始/位圖可能需要一秒才能加載。但是有什麼?我懷疑使用質量較差的JPeg會成爲交易,因爲它不會加速減壓。

也許一個帶有分色通道的壓縮位圖? (不要笑!:-))。也許還有其他的。 ZIP的速度有多快?

另外一個想法是提供幾個解決方案(一次性罰款),並使用最接近的分辨率版本可用。一個1M的分辨率將在內存中爲4M,並且應該導致每秒12個圖像轉換(argh)。我準備看到至少1000 /秒,但在過去的10年裏,電腦電源接縫的飛躍不會那麼大。我將嘗試使用兩個或更多工作線程並行開始。讓我們看看這是否增加了一倍。

+0

*「我的小測試圖片需要64萬像素..」*對不起,什麼?!?您認爲8000x8000像素的圖像是「小」的? BIG究竟是什麼? –

+0

毫無疑問,64M是大的。 GM運行一個單獨的進程,所以啓動/關閉可能會引入一些開銷,可以通過使用gm4java來消除(http://kennethxu.blogspot.com/2013/04/integrate-java-and-graphicsmagick.html)。對於具有大圖像的小型PC來說,1000/s是不可能的,在大型服務器和小圖像下看到我的測試。使用GM時,使用尺寸參數會使性能有很大的不同,也會考慮縮放而不是調整大小。例如gm convert -size 1500x800 source.jpg -scale 750x400 target.jpg –

+0

Kenneth,謝謝你的提示。我將在下週內對此進行調查。非常感謝! –

回答

0

看起來這裏沒什麼不對。我用ImgScalr庫解決並使用ImageIO。產生最快的結果。此外,我使用的JPEG是97%的質量和重新壓縮(改變大小後)。 64M JPEG具有5.8MB的文件大小,加載速度很慢(1.5秒),但在保存了默認質量後,我在0.5秒內加載了1.8MB文件。這使得它更實用。

該軟件現在可以自動縮放大約50個配置文件圖片和260個縮略圖。這足夠快,因爲如果沒有將結果的副本存儲在CDN中,它只能縮放。所以一切都很好。

我真的很震驚,我想每秒約1k,但最終有約50和服務器200左右(估計)是好的,但。

0

64百萬像素的圖像是相當大的。如果任何PC可以調整1K /秒的速度,甚至10秒,我會感到驚訝。您可以看看這個答案的潛在更高性能的方式(https://stackoverflow.com/a/8365035/234901)。但請注意,圖像質量和處理時間有一個折衷。

+0

正如我所說的,它需要我的小PC 3秒的單個64M圖片。我知道這是500MB的數據,但考慮SSD –