int数组到BufferedImage

我正在使用Robot类进行打印,我将BufferedImage转换为int数组。 然后我想将int数组转换回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,它正在工作。

 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); 

变成:

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

它的工作原理! 无论如何,谢谢你的帮助

当您尝试访问超出数组大小的索引处的元素时,会发生ArrayIndexOutOfBoundsexception。 在这种情况下,您将数组传递给setPixels方法,因此其javadocs不会显式检查数组的边界或大小。 所以你应该在调用该方法之前明确地这样做。 例如

  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 

raster.setPixels(0, 0, screen.width, screen.height, pixels);pixels大小raster.setPixels(0, 0, screen.width, screen.height, pixels); 设置BufferedImage.TYPE_INT_RGB时,应为width*height*3

 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);