int array to BufferedImage



我用Robot类制作printscreen,我将BufferedImage转换为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);

但我得到错误:ArrayIndexOutOfBoundsException: 2073600,但为什么?

这一行出现了异常:

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

编辑:它是工作的,如果我改变第二个buffereimage类型为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)

,它工作!谢谢你的帮助

当您尝试访问超出数组大小的索引处的元素时,会发生ArrayIndexOutOfBounds异常。在本例中,您将数组传递给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<numBands; k++) {
                    pixels[Offset++] = getSample(j, i, k, data);
                }
            }
        }
    return pixels;
}

设置BufferedImage.TYPE_INT_RGB时,raster.setPixels(0, 0, screen.width, screen.height, pixels);pixels的大小应为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);

最新更新