import com.sun.glass.ui.Pixels; import com.sun.glass.ui.Robot; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.scene.shape.Circle; import javafx.stage.Stage; import javax.imageio.ImageIO; public class RetinaScreenshot extends Application { Pane root = new Pane(); /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } @Override public void start(final Stage primaryStage) { Scene scene = new Scene(root, 200, 200); primaryStage.setScene(scene); Circle c = new Circle(50, 50, 50); c.setFill(javafx.scene.paint.Color.BLUE); root.getChildren().add(c); c = new Circle(150, 50, 50); c.setFill(javafx.scene.paint.Color.GREEN); root.getChildren().add(c); c = new Circle(50, 150, 50); c.setFill(javafx.scene.paint.Color.RED); root.getChildren().add(c); c.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler() { @Override public void handle(MouseEvent event) { Robot r = com.sun.glass.ui.Application.GetApplication().createRobot(); Pixels p = r.getScreenCapture((int) primaryStage.getX(), (int) primaryStage.getY(), (int) primaryStage.getWidth(), (int) primaryStage.getHeight()); BufferedImage image = new BufferedImage(p.getWidth(), p.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); ByteBuffer bb = p.asByteBuffer(); System.out.println("size: " + p.getWidth() + " x " + p.getHeight()); switch (Pixels.getNativeFormat()) { case Pixels.Format.BYTE_ARGB: System.out.println("BYTE_ARGB"); break; case Pixels.Format.BYTE_BGRA_PRE: System.out.println("BYTE_BGRA_PRE"); break; } System.out.println("Buff size: " + bb.limit() + ", BytesPerComponent: " + p.getBytesPerComponent()); for (int y = 0; y < p.getHeight(); y++) { for (int x = 0; x < p.getWidth(); ++x) { switch (Pixels.getNativeFormat()) { case Pixels.Format.BYTE_ARGB: image.setRGB(x, y, (new Color( (int) bb.get((y * p.getWidth() + x) * 4 + 1) & 0xFF, (int) bb.get((y * p.getWidth() + x) * 4 + 2) & 0xFF, (int) bb.get((y * p.getWidth() + x) * 4 + 3) & 0xFF, (int) bb.get((y * p.getWidth() + x) * 4 + 0) & 0xFF)).getRGB()); break; case Pixels.Format.BYTE_BGRA_PRE: image.setRGB(x, y, (new Color( (int) bb.get((y * p.getWidth() + x) * 4 + 2) & 0xFF, (int) bb.get((y * p.getWidth() + x) * 4 + 1) & 0xFF, (int) bb.get((y * p.getWidth() + x) * 4 + 0) & 0xFF, (int) bb.get((y * p.getWidth() + x) * 4 + 3) & 0xFF)).getRGB()); break; } } } try { ImageIO.write(image, "png", new File("q.png")); System.out.println("saved"); } catch (IOException ex) { System.err.println("Cannot save screenshot"); ex.printStackTrace(System.err); } } }); primaryStage.show(); } }