|
40 | 40 | import com.jme3.audio.openal.ALC; |
41 | 41 | import com.jme3.audio.openal.EFX; |
42 | 42 | import com.jme3.system.JmeContext.Type; |
| 43 | +import com.jme3.texture.Image; |
| 44 | +import com.jme3.texture.image.ColorSpace; |
43 | 45 | import com.jme3.util.Screenshots; |
| 46 | +import jme3tools.converters.ImageToAwt; |
| 47 | + |
44 | 48 | import java.awt.EventQueue; |
45 | 49 | import java.awt.Graphics2D; |
46 | 50 | import java.awt.GraphicsEnvironment; |
@@ -80,30 +84,42 @@ private static BufferedImage verticalFlip(BufferedImage original) { |
80 | 84 | AffineTransform tx = AffineTransform.getScaleInstance(1, -1); |
81 | 85 | tx.translate(0, -original.getHeight()); |
82 | 86 | 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()); |
84 | 88 | Graphics2D g2d = awtImage.createGraphics(); |
85 | 89 | g2d.setRenderingHint(RenderingHints.KEY_RENDERING, |
86 | 90 | RenderingHints.VALUE_RENDER_SPEED); |
87 | 91 | g2d.drawImage(original, transformOp, 0, 0); |
88 | 92 | g2d.dispose(); |
89 | 93 | return awtImage; |
90 | 94 | } |
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 | + |
92 | 108 | @Override |
93 | 109 | 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); |
96 | 112 |
|
97 | 113 | ImageWriter writer = ImageIO.getImageWritersByFormatName(format).next(); |
98 | 114 | ImageWriteParam writeParam = writer.getDefaultWriteParam(); |
99 | 115 |
|
100 | 116 | if (format.equals("jpg")) { |
| 117 | + awtImage = ensureOpaque(awtImage); |
| 118 | + |
101 | 119 | JPEGImageWriteParam jpegParam = (JPEGImageWriteParam) writeParam; |
102 | 120 | jpegParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); |
103 | 121 | jpegParam.setCompressionQuality(0.95f); |
104 | 122 | } |
105 | | - |
106 | | - awtImage = verticalFlip(awtImage); |
107 | 123 |
|
108 | 124 | ImageOutputStream imgOut = new MemoryCacheImageOutputStream(outStream); |
109 | 125 | writer.setOutput(imgOut); |
|
0 commit comments