java.nio.BufferUnderflowException [Bug + Fix]

Hi

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:

Any help?

Thanks in advance

Edit:
Related post/issue:

“ScreenshotAppState” also uses JmeSystem.writeImageFile() but the difference is that ScreenshotAppState does not use ImageRaster.

Submitted a fix:

2 Likes