|
|
|
@ -47,6 +47,10 @@ import com.jme3.texture.image.DefaultImageRaster; |
|
|
|
|
import com.jme3.texture.image.ImageRaster; |
|
|
|
|
import com.jme3.util.Screenshots; |
|
|
|
|
import java.awt.EventQueue; |
|
|
|
|
import java.awt.Graphics2D; |
|
|
|
|
import java.awt.RenderingHints; |
|
|
|
|
import java.awt.geom.AffineTransform; |
|
|
|
|
import java.awt.image.AffineTransformOp; |
|
|
|
|
import java.awt.image.BufferedImage; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.OutputStream; |
|
|
|
@ -55,7 +59,13 @@ import java.nio.ByteBuffer; |
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean; |
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
|
import java.util.logging.Level; |
|
|
|
|
import javax.imageio.IIOImage; |
|
|
|
|
import javax.imageio.ImageIO; |
|
|
|
|
import javax.imageio.ImageWriteParam; |
|
|
|
|
import javax.imageio.ImageWriter; |
|
|
|
|
import javax.imageio.plugins.jpeg.JPEGImageWriteParam; |
|
|
|
|
import javax.imageio.stream.ImageOutputStream; |
|
|
|
|
import javax.imageio.stream.MemoryCacheImageOutputStream; |
|
|
|
|
import javax.swing.SwingUtilities; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -69,11 +79,44 @@ public class JmeDesktopSystem extends JmeSystemDelegate { |
|
|
|
|
return new DesktopAssetManager(configFile); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static BufferedImage verticalFlip(BufferedImage original) { |
|
|
|
|
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); |
|
|
|
|
Graphics2D g2d = awtImage.createGraphics(); |
|
|
|
|
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, |
|
|
|
|
RenderingHints.VALUE_RENDER_SPEED); |
|
|
|
|
g2d.drawImage(original, transformOp, 0, 0); |
|
|
|
|
g2d.dispose(); |
|
|
|
|
return awtImage; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void writeImageFile(OutputStream outStream, String format, ByteBuffer imageData, int width, int height) throws IOException { |
|
|
|
|
BufferedImage awtImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); |
|
|
|
|
Screenshots.convertScreenShot(imageData, awtImage); |
|
|
|
|
ImageIO.write(awtImage, format, outStream); |
|
|
|
|
BufferedImage awtImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); |
|
|
|
|
Screenshots.convertScreenShot2(imageData.asIntBuffer(), awtImage); |
|
|
|
|
|
|
|
|
|
ImageWriter writer = ImageIO.getImageWritersByFormatName(format).next(); |
|
|
|
|
ImageWriteParam writeParam = writer.getDefaultWriteParam(); |
|
|
|
|
|
|
|
|
|
if (format.equals("jpg")) { |
|
|
|
|
JPEGImageWriteParam jpegParam = (JPEGImageWriteParam) writeParam; |
|
|
|
|
jpegParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); |
|
|
|
|
jpegParam.setCompressionQuality(0.95f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
awtImage = verticalFlip(awtImage); |
|
|
|
|
|
|
|
|
|
ImageOutputStream imgOut = new MemoryCacheImageOutputStream(outStream); |
|
|
|
|
writer.setOutput(imgOut); |
|
|
|
|
IIOImage outputImage = new IIOImage(awtImage, null, null); |
|
|
|
|
try { |
|
|
|
|
writer.write(null, outputImage, writeParam); |
|
|
|
|
} finally { |
|
|
|
|
imgOut.close(); |
|
|
|
|
writer.dispose(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|