Java int数组到buffereImage

Java int数组到buffereImage,java,bufferedimage,pixels,Java,Bufferedimage,Pixels,我正在用机器人制作a类打印屏幕,并将BuffereImage转换为int数组。然后我想将int数组转换回buffereImage,但这会产生一个错误。这是我的代码: Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); BufferedImage printscreen = robot.createScreenCapture(new Rectangle(screen)); int[] pixels = ((DataBuff

我正在用
机器人制作
a类打印屏幕,并将BuffereImage转换为int数组。然后我想将int数组转换回buffereImage,但这会产生一个错误。这是我的代码:

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);
但是我得到了错误:
arrayindexoutofbounds异常:2073600
但是为什么

我在这一行遇到了一个例外:

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

编辑:如果我将第二个BuffereImage类型更改为type_BYTE_GRAY,则该操作有效。

当您尝试访问索引中超出数组大小的元素时,会出现
ArrayIndexOutOfBounds
异常。在本例中,您将数组传递给方法,相应地,它的javadocs不会显式地检查数组的边界或大小。因此,在调用该方法之前,应该显式地这样做。e、 g

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

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

而且它有效!无论如何感谢您的帮助光栅.setPixels中
像素的大小(0,0,screen.width,screen.height,pixels)buffereImage时,code>应为
width*height*3
。键入\u INT\u RGB

可以共享堆栈跟踪吗?您是在哪一行获得的?我建议您将所有尺寸基于
屏幕的大小。为了更快地获得更好的帮助,请发布一个。似乎这个问题也需要一些基本的代码行跟踪和大小显示。谢谢你的回答,但是两个BuffereImage的高度和宽度都相同。那么,如果它有相同数量的像素,为什么它需要数组中更多的元素呢?我建议将JDK源代码添加到像eclipse这样的IDE中,并使用调试器检查变量值。这要快得多。我正在使用eclipse。我在你的例子中看到:
numBands*w*h
numBands是什么意思?我的像素阵列有2073600个元素,即1920*1080。你可以在这里浏览源代码-请添加解释。正如@SamirChen所提到的,你有红、绿、蓝、宽像素。所以实际宽度是图像宽度的3倍。非常好的解决方案。作为记录,这也是该页面上唯一对我有效的解决方案。WritableRaster setPixels()文档中没有说明的部分是,传递给setPixels()的int数组不是作为每像素一个压缩int来访问的,而是每个通道一个int(也就是说,RGB需要一个临时数组,其大小是压缩数组的3倍,ARGB的4倍——显然不是一个优雅的解决方案,但我测试了它,它工作了)。
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);
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);
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);