I am trying to create an image and save it in a cross-platform way with JmeSystem.writeImageFile() but I am getting this exception:
SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
java.nio.BufferUnderflowException
at java.base/java.nio.IntBuffer.get(IntBuffer.java:798)
at java.base/java.nio.IntBuffer.get(IntBuffer.java:826)
at com.jme3.util.Screenshots.convertScreenShot2(Screenshots.java:56)
at com.jme3.system.JmeDesktopSystem.writeImageFile(JmeDesktopSystem.java:94)
at com.jme3.system.JmeSystem.writeImageFile(JmeSystem.java:143)
at image.TestImageWrite.simpleInitApp(TestImageWrite.java:42)
at com.jme3.app.SimpleApplication.initialize(SimpleApplication.java:240)
at com.jme3.system.lwjgl.LwjglWindow.initInThread(LwjglWindow.java:548)
at com.jme3.system.lwjgl.LwjglWindow.run(LwjglWindow.java:662)
at java.base/java.lang.Thread.run(Thread.java:833)
My code:
public class TestImageWrite extends SimpleApplication {
public static void main(String[] args) {
new TestImageWrite().start();
}
@Override
public void simpleInitApp() {
ByteBuffer data = BufferUtils.createByteBuffer(512 * 512 * 4);
Image image = new Image(Image.Format.RGBA8, 512, 512, data);
Texture texture = new Texture2D(image);
ImageRaster raster = ImageRaster.create(texture.getImage());
for (int h = 0; h < texture.getImage().getHeight(); h++) {
for (int w = 0; w < texture.getImage().getWidth(); w++) {
raster.setPixel(w, h, ColorRGBA.Blue);
}
}
File f = new File("/home/ali/Desktop/test.png");
try {
JmeSystem.writeImageFile(new FileOutputStream(f), "png", data, texture.getImage().getWidth(), texture.getImage().getHeight());
} catch (IOException e) {
e.printStackTrace();
}
}
}
If I remove these lines error goes away:
ImageRaster raster = ImageRaster.create(texture.getImage());
for (int h = 0; h < texture.getImage().getHeight(); h++) {
for (int w = 0; w < texture.getImage().getWidth(); w++) {
raster.setPixel(w, h, ColorRGBA.Blue);
}
}
As mentioned in Javadoc the image is in RGBA8 format: