Prendre un screenshot en java

Dans le cadre de mon boulot, j'ai du me pencher sur l'enregistrement d'une capture d'écran en Java.
Ce n'est pas très compliqué en soit, mais j'ai été très surpirs de constater qu'il n'y a pas de moyen direct de capturer le pointeur de la souris dans l'image résultante (ce qui est assez pénible quand on veut faire une appli qui enregistre des screencasts).
Bref la seule solution c'est de repaindre le curseur dans l'image résultante avant de l'enregistrer sur le disque.
On peut soit utiliser la bibliothèque standard et AWT, soit utiliser SWT, mais ça devient un poil plus compliqué.
Bref voici les méthodes:
import java.awt.AWTException; import java.awt.Graphics2D; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; /** * Take a screenshot and paint the mouse cursor on it. */ public class Screenbot { private static Robot robot; private static Rectangle screenDimensions; private static BufferedImage mouseCursor; public static void main (String[] args) { // Initialize the mouse cursor try { mouseCursor = ImageIO.read(Screenbot.class.getResource("ressources/cursor.png")); } catch (IOException e) { System.err.println(e.getMessage()); } // Retrieve the default toolkit to have screen dimensions Toolkit tk = Toolkit.getDefaultToolkit(); // Get screen dimensions // For multiples screens set-up it will only retrieve // dimensions of the first screen. screenDimensions = new Rectangle(tk.getScreenSize()); try { robot = new Robot(); } catch (AWTException e) { System.err.println(e.getMessage()); return; } // Retrieve the mouse cursor position Point mouseLocation = MouseInfo.getPointerInfo().getLocation(); BufferedImage screenshot = robot.createScreenCapture(screenDimensions); // Paint a cursor on the screenshot Graphics2D g2D = (Graphics2D) screenshot.getGraphics(); g2D.drawImage(mouseCursor, mouseLocation.x, mouseLocation.y, null); g2D.dispose(); // Save the screenshot with the mouse cursor try { ImageIO.write(screenshot, "PNG", new File("screencapture.png")); } catch (IOException e) { System.err.println(e.getMessage()); } } }
import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.ImageLoader; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; public class Screenbot { public static void main(String[] args) { Display display = Display.getDefault(); // Get the mouse cursor Image mouseCursor = new Image(display, Screenbot.class.getResourceAsStream("ressources/cursor.png")); // retrieve the screen dimensions Rectangle screenBounds = display.getBounds(); // take the screenshot and paint it in the image GC graphicControl = new GC(Display.getDefault()); final Image screenshot = new Image(display, screenBounds); graphicControl.copyArea(screenshot, screenBounds.x, screenBounds.y); graphicControl.dispose(); // Get the graphic control of the taken screenshot graphicControl = new GC(screenshot); // Retrieve the mouse Location Point mouseLocation = Display.getDefault().getCursorLocation(); // paint the cursor on the screenshot graphicControl.drawImage(mouseCursor, mouseLocation.x, mouseLocation.y); graphicControl.dispose(); // Save the screenshot ImageLoader imageLoader = new ImageLoader(); imageLoader.data = new ImageData[] { screenshot.getImageData() }; imageLoader.save("screencapture.png", SWT.IMAGE_PNG); } }
Maintenant il vous reste plus quà trouver un truc cool à faire avec ça.
Le plus simple c'est d'utiliser la version AWT car on a besoin de rien pour la fonctionner. Pour la version SWT il faut embarquer les libraries nécessaires dans l'application (le jar SWT et le jar SWT de la plateforme cf http://eclipse.org/swt/).