使用Java的ImageIO将像素阵列变成Image对象?

时间:2020-03-06 14:38:06  来源:igfitidea点击:

我目前正在使用以下代码将像素值数组(最初使用java.awt.image.PixelGrabber对象创建)转换为Image对象:

public Image getImageFromArray(int[] pixels, int width, int height) {
    MemoryImageSource mis = new MemoryImageSource(width, height, pixels, 0, width);
    Toolkit tk = Toolkit.getDefaultToolkit();
    return tk.createImage(mis);
}

使用ImageIO包中的类是否可以达到相同的结果,所以我不必使用AWT工具包?

Toolkit.getDefaultToolkit()似乎不是100%可靠的,有时会抛出AWTError,而ImageIO类应该始终可用,这就是为什么我有兴趣更改我的方法的原因。

解决方案

使用java.awt.Robot捕获屏幕快照(或者屏幕的一部分)已经取得了成功,但是要使用ImageIO,我们需要将其存储在BufferedImage中而不是存储在图像源中。然后,我们可以调用ImageIO的一种静态方法并保存文件。尝试类似的东西:

// Capture whole screen
Rectangle region = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capturedImage = new Robot().createScreenCapture(region);

// Save as PNG
File imageFile = new File("capturedImage.png");
ImageIO.write(capturedImage, "png", imageFile);

我们可以在不使用ImageIO的情况下创建映像。只需使用与像素数组内容匹配的图像类型创建BufferedImage即可。

public static Image getImageFromArray(int[] pixels, int width, int height) {
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            WritableRaster raster = (WritableRaster) image.getData();
            raster.setPixels(0,0,width,height,pixels);
            return image;
        }

当使用PixelGrabber时,别忘了在调用getImageFromArray之前从像素数组中提取RGBA信息。 PixelGrabber javadoc的handlepixelmethod中有一个示例。完成此操作后,请确保BufferedImage构造函数中的图像类型为BufferedImage.TYPE_INT_ARGB

使用栅格,即使我使用" TYPE_INT_ARGB"创建了" BufferedImage",也得到了" ArrayIndexOutOfBoundsException"。但是,使用BufferedImagesetRGB(...)方法对我有用。