2010-03-29 39 views
1

我想調整Java BufferedImage的大小,使其垂直變小但不使用任何類型的平均值,以便如果像素行是「空白「(白色),則在目標圖像的相應位置會出現一個白色像素行:」最小「操作。默認算法(在getScaledInstance中指定)不允許我進行足夠精細的控制。我想實現以下邏輯:如何指定Java BufferedImage的行爲resize:需要min而不是平均的像素行

for each pixel row in the w-pixels wide destination image, d = pixel[w] 
    find the corresponding j pixel rows of the source image, s[][] = pixel[j][w] 
    write the new line of pixels, so that d[i] = min(s[j][i]) over all j, i 

我一直在閱讀上RescaleOp,但還沒有想出如何實現這一功能 - 這是無可否認的一個奇怪類型的縮放。任何人都可以提供我如何做到這一點的指針?在更糟的情況下,我想我可以保留目標ImageBuffer並複製僞代碼之後的像素,但我想知道是否有更好的方法。

回答

1

RescaleOp方法包含一個名爲RenderingHints的參數。有一個提示KEY_INTERPOLATION決定縮放圖像時使用的顏色。

如果對KEY_INTERPOLATION使用值VALUE_INTERPOLATION_NEAREST_NEIGHBOR,則Java將使用原始顏色,而不是使用某種類型的算法重新計算新顏色。

所以,而不是白色線條變成灰色或某種顏色的混合,你會得到任何白線,或者你根本得不到任何線條。這一切都取決於比例因子,如果它是偶數或奇數行。例如,如果您縮放一半,則每個1像素水平線至少會在新圖像中出現50%的變化。但是,如果白線的高度是兩個像素,則會出現100%的白線出現機率。

除了編寫自己的縮放方法之外,這可能是您最接近的方法。不幸的是,我沒有看到任何其他可能有助於進一步提示的提示。

要實現您自己的縮放方法,您可以創建一個實現BufferedImageOp接口的新類,並實現filter()方法。在BufferedImage對象上使用getRGB()setRGB()以從原始圖像獲取像素並設置新圖像上的像素。

+0

你可能是對的 - 我不認爲有比執行我自己的BufferedImageOp更好的方法。謝謝! – tucuxi 2010-03-30 02:24:21