Skip to content

Commit 49a3102

Browse files
authored
Fix issue #1850 (JmeSystem.writeImageFile() throw java.nio.BufferUnderflowException) (#1851)
1 parent 7fa8f7d commit 49a3102

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

jme3-desktop/src/main/java/com/jme3/system/JmeDesktopSystem.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@
4040
import com.jme3.audio.openal.ALC;
4141
import com.jme3.audio.openal.EFX;
4242
import com.jme3.system.JmeContext.Type;
43+
import com.jme3.texture.Image;
44+
import com.jme3.texture.image.ColorSpace;
4345
import com.jme3.util.Screenshots;
46+
import jme3tools.converters.ImageToAwt;
47+
4448
import java.awt.EventQueue;
4549
import java.awt.Graphics2D;
4650
import java.awt.GraphicsEnvironment;
@@ -80,30 +84,42 @@ private static BufferedImage verticalFlip(BufferedImage original) {
8084
AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
8185
tx.translate(0, -original.getHeight());
8286
AffineTransformOp transformOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
83-
BufferedImage awtImage = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_BGR);
87+
BufferedImage awtImage = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());
8488
Graphics2D g2d = awtImage.createGraphics();
8589
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
8690
RenderingHints.VALUE_RENDER_SPEED);
8791
g2d.drawImage(original, transformOp, 0, 0);
8892
g2d.dispose();
8993
return awtImage;
9094
}
91-
95+
96+
private static BufferedImage ensureOpaque(BufferedImage original) {
97+
if (original.getTransparency() == BufferedImage.OPAQUE)
98+
return original;
99+
int w = original.getWidth();
100+
int h = original.getHeight();
101+
int[] pixels = new int[w * h];
102+
original.getRGB(0, 0, w, h, pixels, 0, w);
103+
BufferedImage opaqueImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
104+
opaqueImage.setRGB(0, 0, w, h, pixels, 0, w);
105+
return opaqueImage;
106+
}
107+
92108
@Override
93109
public void writeImageFile(OutputStream outStream, String format, ByteBuffer imageData, int width, int height) throws IOException {
94-
BufferedImage awtImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
95-
Screenshots.convertScreenShot2(imageData.asIntBuffer(), awtImage);
110+
BufferedImage awtImage = ImageToAwt.convert(new Image(Image.Format.RGBA8, width, height, imageData, ColorSpace.Linear), false, true, 0);
111+
awtImage = verticalFlip(awtImage);
96112

97113
ImageWriter writer = ImageIO.getImageWritersByFormatName(format).next();
98114
ImageWriteParam writeParam = writer.getDefaultWriteParam();
99115

100116
if (format.equals("jpg")) {
117+
awtImage = ensureOpaque(awtImage);
118+
101119
JPEGImageWriteParam jpegParam = (JPEGImageWriteParam) writeParam;
102120
jpegParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
103121
jpegParam.setCompressionQuality(0.95f);
104122
}
105-
106-
awtImage = verticalFlip(awtImage);
107123

108124
ImageOutputStream imgOut = new MemoryCacheImageOutputStream(outStream);
109125
writer.setOutput(imgOut);

0 commit comments

Comments
 (0)