使用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"。但是,使用BufferedImage
的setRGB(...)
方法对我有用。