2013-01-19 77 views
5

我正在與Robot類打印屏幕和我將BufferedImage轉換爲int數組。然後我想要將int數組轉換回bufferedimage,但是會產生錯誤。這是我的代碼:詮釋數組BufferedImage

Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
BufferedImage printscreen = robot.createScreenCapture(new Rectangle(screen)); 
int[] pixels = ((DataBufferInt) printscreen.getRaster().getDataBuffer()).getData(); 

BufferedImage image = new BufferedImage(screen.width, screen.height, BufferedImage.TYPE_INT_RGB); 
WritableRaster raster = (WritableRaster) image.getRaster(); 
raster.setPixels(0, 0, screen.width, screen.height, pixels); 

但我得到錯誤:ArrayIndexOutOfBoundsException: 2073600但爲什麼?

我得到該線路上的異常:

raster.setPixels(0, 0, screen.width, screen.height, pixels); 

編輯:如果我改變了第二的BufferedImage類型TYPE_BYTE_GRAY這是工作。

+2

你可以分享堆棧跟蹤嗎?你在哪一行得到它? – Swapnil

+0

在帖子中編輯。 –

+0

我建議把所有的尺寸都放在'screen'的尺寸上。爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。似乎這個問題正在尖叫出一些基本的代碼行跟蹤和大小顯示。 –

回答

1

更改爲:

getRaster().getPixels(0, 0, screen.width, screen.height, pixels) 

和它的作品!感謝您的幫助反正

0

ArrayIndexOutOfBounds異常發生在您嘗試訪問超過數組大小的索引處的元素時。在這種情況下,您將數組傳遞給setPixels方法,相應地,其javadoc不會顯式檢查數組的邊界或大小。所以你應該在調用該方法之前明確地做到這一點。例如

if(x >= 0 && x < arr.length) { 
     // some code 
    } 

這是來自WritableRaster使用的SampleModel類的相關代碼。

public int[] getPixels(int x, int y, int w, int h, 
          int iArray[], DataBuffer data) { 

     int pixels[]; 
     int Offset=0; 

     if (iArray != null) 
      pixels = iArray; 
     else 
      pixels = new int[numBands * w * h]; 

     for (int i=y; i<(h+y); i++) { 
      for (int j=x; j<(w+x); j++) { 
       for(int k=0; k<numBands; k++) { 
        pixels[Offset++] = getSample(j, i, k, data); 
       } 
      } 
     } 

    return pixels; 
} 
+0

感謝您的回答,但兩個BufferedImage具有相同的高度和寬度。那麼爲什麼它需要更多的元素在數組中,如果它有相同數量的像素? –

+0

我建議將JDK源添加到像eclipse這樣的IDE並使用調試器來檢查變量值。這要快得多。 – Swapnil

+0

我正在使用eclipse。 我在你的例子中看到:'numBands * w * h' numBands是什麼意思?我的像素陣列有2073600個元素,它是1920 * 1080。 –

12
int[] bitMasks = new int[]{0xFF0000, 0xFF00, 0xFF, 0xFF000000}; 
SinglePixelPackedSampleModel sm = new SinglePixelPackedSampleModel(
     DataBuffer.TYPE_INT, width, height, bitMasks); 
DataBufferInt db = new DataBufferInt(pixels, pixels.length); 
WritableRaster wr = Raster.createWritableRaster(sm, db, new Point()); 
BufferedImage image = new BufferedImage(ColorModel.getRGBdefault(), wr, false, null); 
+0

非常好的解決方案。爲了記錄,這也是該網頁上爲我工作的唯一解決方案。未在WritableRaster setPixels()文檔中聲明的部分是,傳遞給setPixels()的int數組不是以每個像素的one-packed-int的形式訪問,而是顯然每個通道一個int(即RGB需要一個3倍於他打包的大小的臨時陣列,4次ARGB--顯然不是一個優雅的解決方案,但我測試了它並且工作正常)。 –

0

raster.setPixels(0, 0, screen.width, screen.height, pixels);pixels的大小應該width*height*3當你設置BufferedImage.TYPE_INT_RGB

0
BufferedImage image = new BufferedImage(screen.width*3, screen.height,BufferedImage.TYPE_INT_RGB); 
WritableRaster raster = (WritableRaster) image.getRaster(); 

raster.setPixels(0, 0, screen.width*3, screen.height, pixels); 
+1

請添加說明。 –

+0

正如@SamirChen所提到的,您的寬度上有紅色,綠色,藍色像素。所以實際寬度是圖像寬度的3倍。 – ayman