2012-11-11 42 views
1

我試圖使用類型TYPE_3BYTE_BGRBufferedImage的底層DataBufferByte儘可能快地設置像素值。使用BufferedImage的DataBuffer設置像素

也許我不理解,但是當我做了以下...

byte[] imgBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData(); 

...它好像我收到的byte [],而不是一個引用的副本。例如,如果我跑......

System.out.println(System.identityHashCode(imgBytes)); 
System.out.println(System.identityHashCode((DataBufferByte) img.getData().getDataBuffer()).getData()); 

...我得到兩個明顯不同對象的哈希值。如果我沒有弄錯,這表明我沒有得到底層字節[]的引用,而是一個副本。如果是這種情況,我該如何直接編輯0​​???

或者我只是設置錯誤的像素...當我在imgBytes中設置像素時,它似乎沒有對BufferedImage執行任何操作。一旦我得到的byte [],我設定每個像素值,像這樣:

imgBytes[intOffset] = byteBlue; 
imgBytes[intOffset+1] = byteGreen; 
imgBytes[intOffset+2] = byteRed; 

對我來說,這一切似乎罰款。我可以用這種方式讀取像素,所以看起來我應該可以用相同的方式寫出它們!

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。熱鏈接到一個小的(以字節爲單位)的圖像或在代碼中生成一個。 –

回答

0

我曾經玩過Java中圖像的像素操作。不要直接回答你的問題,我會爲你的問題提供一個替代解決方案。你可以做到以下幾點,以創建像素陣列來操作:

final int width = 800; 
final int height = 600; 
final int[] pixels = new int[width * height]; // 0xAARRGGBB 
MemoryImageSource source = new MemoryImageSource(width, height, pixels, 0, width); 
source.setAnimated(true); 
source.setFullBufferUpdates(true); 
Image image = Toolkit.getDefaultToolkit().createImage(source); 
image.setAccelerationPriority(1f); 

然後繪製圖像,你可以簡單地調用從Graphics類的drawImage方法。

還有其他一些方法可以實現您要查找的內容,但這種方法對我來說最簡單。

+0

有趣的...我將不得不用一個ImageTypeSpecifier&ColorModel來測試它,以便與byte []而不是int []一起使用它,但是這種方法看起來很有前途。 我假設這和編輯已有的BufferedImage的DataBuffer一樣快,對吧? – Marty

+0

據我所知他們會大致相同,但我沒有長時間觸及它,只是認爲我會提供一個不同的解決方案:)。 – Jyro117

0

下面是它在JDK7中的實現方式。如果這些東西不適合你,你可能會在其他地方發生錯誤。

public byte[] getData() { 
    theTrackable.setUntrackable(); 
    return data; 
} 
1

我有同樣的問題。你可能不使用getData(),而是使用getRaster(),它給你一個你可以用來寫入的數組。

相關問題