2014-09-21 27 views
3

我正嘗試用Java重新調整圖像的大小,並且我需要獲得使用Photoshop最近鄰居(保留硬邊)重新調整大小時發生的確切效果。Java圖像大小調整 - 最近的鄰居

的事情是我從來沒有得到確切的同樣的效果......

我嘗試以下方法:

1)Java的圖像規模由mortennobel lib

resampleOp.setFilter(ResampleFilters.getBoxFilter()); 

這個執行很大,但在圖像中留下了一些文物,當photoshop使用它時不存在。

2)用於圖像處理的十二個圖像庫。 (here is the github link) 沒有工作,PointFilter完全破壞了裏面的漸變,而Box過濾器和mortennobel getBoxFilter做同樣的事情。

3)AWT AffineTransform,這是最糟糕的一個,完全不切實際的調整大小。

現在我很迷茫,不Photoshop的近鄰重新大小不同又是什麼名字的意思,或其他所有的庫做是錯誤的(在第二種情況下,那是什麼都將做正確的lib?)

這裏是之前和之後的圖像生成的Photoshop

enter image description here enter image description here

這裏是從mortennobel LIB由get BoxFilter產生的圖像。

enter image description here

我縮放圖像有點激動,所以你可以看到細節,實際上它們是較小的。 任何幫助真的很感激:)我真的堅持這一點。

+0

mortennobel圖書館使用箱式過濾器,因此不是您要求的 - 最近的鄰居。你有沒有考慮自己編寫代碼?在沒有任何過濾的情況下迭代原始圖像像素並不困難。 – usr2564301 2014-09-21 11:39:40

+0

嗯..我以爲盒式過濾器和最近的鄰居是一樣的。那麼我已經考慮過了,但是我認爲它可能會很慢,另外,應該有一個lib來做這件事嗎?而不是花哨的過濾器使用簡單的過濾器,這就是我想要的。我覺得Photoshop有另一個名字,如果我知道它,我會找到正確的lib。 – 2014-09-21 11:44:49

+2

您可能想要解釋使用'RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR'的結果與您想要達到的結果的差異(另請參閱https://today.java.net/pub/a/today/2007/04/03/ perl-image-getscaledinstance.html#creating-scaled-instances) – Marco13 2014-09-21 12:35:58

回答

1

巨大感謝Marco13指出這一點!顯然mortennobel lib不會做最近鄰, 而不是AWT的Graphics2D可以與RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR渲染提示一起使用。 以下是爲我工作並生成photoshop精確圖像的代碼片段。

destinationBufferedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); 
Graphics2D g2 = destinationBufferedImage.createGraphics(); 
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); 
g2.drawImage(sourceBufferedImage, 0, 0, newWidth, newHeight, null); 
g2.dispose();