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/).
- furet's blog
- Vous devez vous connecter pour poster des commentaires


