5

Robotこのクラスでprintscreenを作成し、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);

編集:2番目のbufferedimageタイプをTYPE_BYTE_GRAYに変更すると機能します。

4

5 に答える 5

14
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);
于 2013-02-21T12:05:12.420 に答える
1

変更:

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

そしてそれは動作します!とにかく助けてくれてありがとう

于 2013-01-20T13:21:56.810 に答える
0

配列のArrayIndexOutOfBoundsサイズを超える index の要素にアクセスしようとすると、例外が発生します。この場合、配列をsetPixelsメソッドに渡します。したがって、その javadocs は、配列の境界またはサイズを明示的にチェックしません。したがって、そのメソッドを呼び出す前に明示的に行う必要があります。例えば

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

SampleModelこれは、 WritableRaster によって使用されるクラスの関連コードです。

    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;
}
于 2013-01-19T16:10:22.387 に答える
0

のサイズはpixelsraster.setPixels(0, 0, screen.width, screen.height, pixels);width*height*3設定したときのサイズですBufferedImage.TYPE_INT_RGB

于 2014-06-16T08:54:59.423 に答える
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);
于 2014-11-08T10:17:12.370 に答える