瀏覽代碼

Fix issue #1850 (JmeSystem.writeImageFile() throw java.nio.BufferUnderflowException) (#1851)

Ali-RS 3 年之前
父節點
當前提交
49a3102f52
共有 1 個文件被更改,包括 22 次插入6 次删除
  1. 22 6
      jme3-desktop/src/main/java/com/jme3/system/JmeDesktopSystem.java

+ 22 - 6
jme3-desktop/src/main/java/com/jme3/system/JmeDesktopSystem.java

@@ -40,7 +40,11 @@ import com.jme3.audio.openal.ALAudioRenderer;
 import com.jme3.audio.openal.ALC;
 import com.jme3.audio.openal.EFX;
 import com.jme3.system.JmeContext.Type;
+import com.jme3.texture.Image;
+import com.jme3.texture.image.ColorSpace;
 import com.jme3.util.Screenshots;
+import jme3tools.converters.ImageToAwt;
+
 import java.awt.EventQueue;
 import java.awt.Graphics2D;
 import java.awt.GraphicsEnvironment;
@@ -80,7 +84,7 @@ public class JmeDesktopSystem extends JmeSystemDelegate {
         AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
         tx.translate(0, -original.getHeight());
         AffineTransformOp transformOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
-        BufferedImage awtImage = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_BGR);
+        BufferedImage awtImage = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());
         Graphics2D g2d = awtImage.createGraphics();
         g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                              RenderingHints.VALUE_RENDER_SPEED);
@@ -88,22 +92,34 @@ public class JmeDesktopSystem extends JmeSystemDelegate {
         g2d.dispose();
         return awtImage;
     }
-    
+
+    private static BufferedImage ensureOpaque(BufferedImage original) {
+        if (original.getTransparency() == BufferedImage.OPAQUE)
+            return original;
+        int w = original.getWidth();
+        int h = original.getHeight();
+        int[] pixels = new int[w * h];
+        original.getRGB(0, 0, w, h, pixels, 0, w);
+        BufferedImage opaqueImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        opaqueImage.setRGB(0, 0, w, h, pixels, 0, w);
+        return opaqueImage;
+    }
+
     @Override
     public void writeImageFile(OutputStream outStream, String format, ByteBuffer imageData, int width, int height) throws IOException {
-        BufferedImage awtImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
-        Screenshots.convertScreenShot2(imageData.asIntBuffer(), awtImage);
+        BufferedImage awtImage = ImageToAwt.convert(new Image(Image.Format.RGBA8, width, height, imageData, ColorSpace.Linear), false, true, 0);
+        awtImage = verticalFlip(awtImage);
 
         ImageWriter writer = ImageIO.getImageWritersByFormatName(format).next();
         ImageWriteParam writeParam = writer.getDefaultWriteParam();
 
         if (format.equals("jpg")) {
+            awtImage = ensureOpaque(awtImage);
+
             JPEGImageWriteParam jpegParam = (JPEGImageWriteParam) writeParam;
             jpegParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
             jpegParam.setCompressionQuality(0.95f);
         }
-
-        awtImage = verticalFlip(awtImage);
         
         ImageOutputStream imgOut = new MemoryCacheImageOutputStream(outStream);
         writer.setOutput(imgOut);