2010-12-03 36 views
6

當BufferedImage的使用setRGB的getRGB方法的工作,我注意到兩兩件事:在一個BufferedImage的INT工作[]像素陣列

  1. setRGB的getRGB方法可在某些系統上非常慢(比修改int []數組要慢兩個數量級)。

  2. 沒有保證遵循setRGB一個的getRGB會給回你通過

最後這一點基本上是從的JavaDoc很清楚setRGB,相同的像素,其狀態:

...對於具有IndexColorModel的圖像, 最接近顏色的索引是選擇了。

看我可以在一個BufferedImage的INT []個像素,這是我可以通過執行訪問直接工作,例如:

int[] a = ((DataBufferInt) tmp.getRaster().getDataBuffer()).getData(); 

我想知道:是否有任何已知的缺點/陷阱時,直接操縱int[]中的像素?

回答

4

getData()讓您訪問backing int數組的全部內容正是爲了這種優化,所以它的好處很可能超過了缺點。

缺點取決於你如何使用緩衝圖像。如果您在編輯屏幕時將其繪製到屏幕上,則可能會在屏幕上遇到一些僞像(如像素未及時着色),在這種情況下,您應該考慮雙緩衝(其涉及複製整個圖像每刷新一次)。

+0

+1,但您能否提供更多關於雙緩衝應該/可以完成的信息? – SyntaxT3rr0r 2010-12-03 18:43:06

0

不確定這是否與您的問題相關,但在使用方法getSubimage(int x, int y, int w, int h)創建BufferedImage時會遇到問題。

返回由指定的矩形區域定義的子圖像。返回的BufferedImage的 與原始的 圖像共享相同的數據數組。

方法getTileGridXOffset()getTileGridYOffset()返回儘管被描述爲

然後偏移返回x相對於原點tile網格的偏移,對於 例如,瓦片的位置的x座標(0,0)。 這是 始終爲零。

而是因爲你不能(據我所知)訪問光柵的scanlineStride領域,您將無法得到該陣列正確的索引。