2011-08-04 77 views
4

我們有一個使用servlet調整圖像大小的照片庫 - 我們需要良好的性能和良好的質量,但是我們無法做到。另外,可悲的是,我們只有java 1.4,這讓我們幾乎沒有任何外部圖像庫(幾乎所有我發現的是java 1.5+),並且java圖像處理效果並不好。java 1.4質量好的圖像調整大小

如果我用這個:

private static BufferedImage scaleImage(BufferedImage orig, int type, int w, int h) { 

    BufferedImage tmp = new BufferedImage(w, h, type); 
    Graphics2D g2 = tmp.createGraphics(); 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 

    g2.drawImage(orig, 0, 0, w, h, null); 
    g2.dispose(); 
    return tmp; 
} 

的結果幾乎是相同的每一次(和難看)或非常慢,這取決於選擇的提示。我讀了幾乎所有關於圖像調整大小的文章(包括this one,但它並沒有幫助)

你有什麼想法嗎?任何外部庫的Java 1.4是快速和質量不錯?任何算法,會得到很好的結果?

+2

爲什麼*任何人*堅持使用9年前的軟件版本,並且在7年前被新版本取代? –

+1

@Joachim,也許他們生活在一塊石頭下? :D – mre

+0

@Joachim,好吧,我們與SAP門戶合作,他們還沒有升級到更高版本的Java:/ – lzk

回答

2

你可以嘗試難懂的包裝像JMagick

+0

非常感謝:) JMagick的唯一問題似乎是無法從InputStream加載圖像,這是我的情況:/嗯,我會盡力處理:) – lzk

+0

這可能是因爲它委託實際工作命令行工具ImageMagick。 –

+0

@Izk您可以將圖像寫入文件,在該文件上調用Image Magick並重新加載。另一種選擇是im4java,但似乎只有Java 5+版本。 – Thomas

0

IZK,給您的要求我會與托馬斯同意你(可能)需要依靠外部/機庫。

如果hadn我沒有明確提到表現,我會提出建議使用BICUBIC插值與Chris Campbell的增量縮放算法一起進行。 imgscalr library實現了所有這些,但它確實需要Java 5(使用枚舉)。話雖如此,您可以輕鬆地將代碼複製到Java 1.4兼容的實現中。

去看看Scalr class,滾動到非常低的位置,並複製最後兩個方法。如果你想保持它在Java中的實現,那麼你就需要完成95%的工作。

但是,如果在此之前發現Java縮放性能不可接受,那麼該實現不會對您有所幫助。您需要查看使用像ImageMagick這樣的本機庫。

幸運的是ImageMagick有2個流行的Java綁定,如果JMagick API不允許你處理InputStreams,你可以看看im4java這是對ImageMagick命令行版本的直接封裝。我挖掘了源代碼,它看起來像核心ImageCommand class用於包裝「命令」以發送到命令行util允許您在執行操作時將BufferedImage實例作爲「圖像」對象參數傳遞。

如果是這種情況,您可以使用ImageIO.read(InputStream)將圖像數據讀取到BufferedImage中,然後將其發送到ImageMagick以使用im4java API進行處理。

有幾個建議可以幫助你找到需要的地方,我希望他們能幫到你。

+0

非常感謝您的詳細分析,它非常有幫助,我非常感謝。 – lzk