2010-10-25 81 views
3

我想要採取BufferedImage,應用傅立葉變換(使用jtransforms),並將數據寫回到BufferedImage。但我堅持創建一個新的Raster來設置結果,我錯過了什麼嗎?如何從Java中的像素浮點數組創建柵格?

BufferedImage bitmap; 
float [] bitfloat = null; 

bitmap = ImageIO.read(new File("filename")); 
FloatDCT_2D dct = new FloatDCT_2D(bitmap.getWidth(),bitmap.getHeight()); 

bitfloat = bitmap.getData().getPixels(0, 0, bitmap.getWidth(), bitmap.getHeight(), bitfloat); 
dct.forward(bitfloat, false); 

但是我很難完成這條線,我應該給createRaster函數什麼?對於createRaster的javadoc毫無意義的我:

bitmap.setData(Raster.createRaster(`arg1`, `arg2`, `arg3`)); 

我開始懷疑,如果一個int數組甚至是必要的,但目前還沒有在那裏jtransforms的例子很多。

回答

4

不要創建新的Raster。使用WritableRaster.setPixels(int,int,int,int,float[])將數組寫回圖像。

final int w = bitmap.getWidth(); 
final int h = bitmap.getHeight(); 

final WritableRaster wr = bitmap.getData(); 
bitfloat = wr.getPixels(0, 0, w, h, bitfloat); 

// do processing here 

wr.setPixels(0, 0, w, h, bitfloat);  

還要注意的是,如果你打算顯示此圖像,你應該將它複製到screen-compatible type; ImageIO很少返回這些。

+2

太棒了,我知道我錯過了一些明顯的東西。如果我忘記了,我會提醒我獎賞你的賞金(我必須等待24小時) – 2010-10-28 10:22:09

0

我正在做谷歌搜索FloatDCT_2D,看看它在什麼軟件包/庫,它看起來像有幾個引用各種來源,如「edu.emory.mathcs.jtransforms.dct.FloatDCT_2D」。如果不知道自己使用的是什麼定製庫,那麼就很難就如何執行轉換給出任何建議。

我的猜測是一般情況下,您應該讀取原始光柵的輸入數據,對原始數據執行轉換,然後將輸出寫入新的光柵。

但是,你最後的聲明本身看起來很奇怪...... Raster.createRaster()看起來像你正在調用一個靜態方法,對於你從未發佈的代碼中沒有引用的類沒有參數。如何爲您的位圖生成數據?即使在僞代碼中,您也需要獲取變換的結果並生成結果柵格。

+1

是的,那就是我想要做的。 Raster.createRaster()有三個參數,但我完全不知道該給它什麼,jRadocs for createRaster根本沒用。 – 2010-10-26 08:30:20