我如何使用Java調整圖像大小?


Answers

FWIW我剛發布(Apache 2,託管在GitHub上)一個簡單的用於Java的圖像縮放庫,稱為imgscalr (可在Maven central上找到 )。

圖書館採用了幾種不同的圖像縮放方法(包括克里斯坎貝爾的增量方法和一些小的增強功能),如果你問它或者給你最快或最好看的(如果你請求)。

用法很簡單,只是一堆靜態方法。 最簡單的用例是:

BufferedImage scaledImage = Scalr.resize(myImage, 200);

所有操作都會保持圖像的原始比例,因此在這種情況下,您要求imgscalr在200像素寬和200像素高的範圍內調整圖像大小,默認情況下,它會自動選擇最好看和最快的方法,因為它沒有沒有說明。

我從一開始就意識到這看起來像是自我推銷(現在是這樣),但我花費了我相當多的時間搜索這個完全相同的主題,並不斷得出不同的結果/方法/想法/建議,並決定坐下來寫一個簡單的實現可以解決80-85%的使用情況,在這種情況下你有一個圖像,並可能需要一個縮略圖 - 盡可能快或盡可能好看(對於那些已經嘗試過的,你會注意到即使使用BICUBIC插值來執行Graphics.drawImage以獲得足夠小的圖像,它仍然看起來像垃圾)。

Question

我需要調整PNG,JPEG和GIF文件的大小。 我如何使用Java來做到這一點?




如果你正在處理大圖片或者想要一個好看的結果,那麼在java中這不是一件簡單的任務。 只需通過Graphics2D的重新調整操作就可以創建高質量的縮略圖。 您可以使用JAI來完成這項工作,但是它需要做的工作超出您想像的那麼看起來不錯,並且JAI有一個讓我們的JVM出現OutOfMemory錯誤的惡習。

如果你能擺脫它,我建議使用ImageMagick作為外部可執行文件。 它的使用簡單,它的工作權利,使你不必。




您可以嘗試使用帶有im4java GraphicsMagick圖像處理系統作為Java的命令行界面。

GraphicsMagick有很多優點,但只有一個:

  • 通用汽車用於處理全球最大的照片網站(例如Flickr和Etsy)的數十億個文件。



Image Magick已被提及。 有一個名為JMagick的JNI前端項目。 這不是一個特別穩定的項目(Image Magick本身已知會改變很多甚至是破壞兼容性)。 也就是說,我們在生產環境中使用了JMagick和Image Magick的兼容版本,以高吞吐量,低延遲率執行擴展。 使用我們以前嘗試的全部Java圖形庫,速度顯著提高。

http://www.jmagick.org/index.html







只需使用Burkhard的答案,但在創建圖形後添加下面的代碼:

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

您也可以將該值設置為BICUBIC,它會產生更好的圖像質量,但操作更為昂貴。 還有其他渲染提示可以設置,但我發現插值會產生最顯著的效果。 請記住,如果你想放大很多,Java代碼很可能會很慢。 我發現較大的圖像開始產生滯後約300%的縮放,即使所有渲染提示都設置為優化速度而不是質量。




事實證明,編寫高性能縮放器並不是微不足道的。 我曾為一個開源項目做過一次: ImageScaler

原則上'java.awt.Image#getScaledInstance(int,int,int)'也可以完成這項工作,但是有一個令人討厭的錯誤 - 請參閱我的鏈接了解詳細信息。




你不需要一個庫來做到這一點。 你可以用Java本身來完成它。

Chris Campbell在縮放圖像方面有出色的和詳細的寫作 - 請參閱本文

Chet Haase和Romain Guy在他們的書“ Filthy Rich Clients”中也有詳細而且非常翔實的圖像縮放的書寫。