加入Erik的關於getScaledInstance的觀點,如果您不再使用Java2D中推薦的縮放機制,您可能已經注意到您的圖像看起來明顯更糟。
其原因是當Java2D的勸阻使用getScaledInstance和AreaAveragingScaleFilter的,他們沒有與任何容易 API中使用替換它,而不是我們直接使用的Java2D的API留給我們自己的設備。幸運的是,Chris Campbell(來自J2D團隊)跟進了使用增量縮放技術的建議,該技術給了AreaAveragingScaleFilter類似的結果,並且運行速度更快;不幸的是,這些代碼的體積很大,並沒有解決你原先的比例問題。
約6個月前,我一次又一次地看到所有關於「縮放Java圖像」的問題,並最終收集了所有的建議,做了所有的挖掘和研究,並將所有這些都編譯成了一個「最好的做法「image scaling library。
由於API只有一個類和一堆靜態方法,因此它非常簡單。基本使用方法如下:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 320);
這是simplest call,其中圖書館將成爲在質量最好的猜測,孝敬你的圖像比例,以及320×320邊框內適合的結果。注意,邊界框只是使用的最大W/H,因爲您的圖像比例很高,所得到的圖像仍然可以兌現,比如320x200。
如果你想覆蓋自動模式並強制它給你最好看的結果,甚至對結果使用非常溫和的抗混疊過濾器,所以它看起來更好(尤其適用於縮略圖),那個調用看起來像:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY,
150, 100, Scalr.OP_ANTIALIAS);
這些都只是例子,API是廣泛的,涵蓋從超簡單的用例到非常專業的一切。你甚至可以通過自己的BufferedImageOps來應用到圖像上(並且庫自動修復了6年的BufferedImageOp JDK bug!)
還有很多東西在Java中成功縮放圖像例如,對於您來說,始終將圖像保存爲支持最佳的RGB或ARGB圖像類型之一。如果用於任何圖像操作的圖像類型得不到支持,則Java2D圖像處理管道將回退到較差的軟件管道。
如果聽起來像很多令人頭疼的事情,那就是......這就是爲什麼我編寫圖書館並開放源代碼的原因,所以人們可以調整他們的圖像大小並繼續他們的生活而不必擔心它。
希望有所幫助。
耶它的getHeight錯誤錯字 沒有任何理由我不能使用getScaledInstance與BufferdImage? – user63898 2009-06-14 03:11:30
這應該沒問題,因爲BufferedImage擴展Image – Max 2009-06-16 00:05:20
哈,謝謝你的第一個等式。在我困惑的大腦中點擊一下! – Cameron 2012-01-03 05:32:57