Programmation Java Swing/Créer une image

Une application peut avoir besoin de créer une image, soit pour réutiliser cette image et l'afficher plusieurs fois en évitant de tout redessiner à nouveau, soit pour créer un fichier externe utilisable dans une autre application.

La création d'une image peut se faire aussi simplement que le dessin d'un composant, en utilisant un contexte graphique.

Créer une image modifier

La classe java.awt.image.BufferedImage permet de créer une nouvelle image. Le type d'image et sa taille en pixels doit être spécifié au constructeur.

Exemple :

// Image 200x100 pixels
// Couleurs RVB sur 8 bits regroupés en pixels de type entier (int) :
BufferedImage b_image = new BufferedImage(200,100, BufferedImage.TYPE_INT_RGB);

Dessiner le contenu modifier

Le contenu est ensuite dessiné en obtenant un contexte graphique, comme celui utilisé pour dessiner un composant :

Graphics2D g = b_image.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0,0,200,100);
g.setColor(Color.BLUE);
g.drawRect(100,50,50,25);
g.dispose(); // Libérer le contexte après utilisation

Comme le contexte graphique est de la même classe que celui utilisé pour le dessin d'un composant, les mêmes méthodes s'appliquent, donc notamment la méthode addRenderingHints pour améliorer la qualité de l'image.

Enregistrer l'image modifier

Enregistrer l'image se fait en utilisant la classe javax.imageio.ImageIO, en appelant la méthode statique write et en lui passant l'image, le nom du format d'image, et le chemin du fichier (de type java.io.File):

ImageIO.write(b_image, "png", new File("D:\Temp\image.png"));

Capture d'écran modifier

La classe java.awt.Robot permet d'automatiser certaines actions de l'utilisateur (déplacer le curseur de souris, générer des touches, ...) et de réaliser des captures d'écrans. Son but principal est de pouvoir tester des applications automatiquement.

La classe possède deux constructeurs :

Robot()
Constructeur d'instance pour l'écran principal.
Robot(GraphicsDevice device)
Constructeur d'instance pour l'écran spécifié.

Ensuite, il suffit d'appeler la méthode createScreenCapture(Rectangle bounds) pour créer une image de capture de la zone spécifiée de l'écran. L'image retournée est de type java.awt.image.BufferedImage.

Le code suivant réalise une capture de l'écran principal :

Robot robot = new Robot();

MediaTracker mt = new MediaTracker(this); // Argument de type Component, 
//    this ok si le code est dans une classe de type composant ou fenêtre.

// Dimension(width, height) --> Rectangle(0, 0, width, height)
Rectangle tout_l_ecran = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

BufferedImage image_capture = robot.createScreenCapture(tout_l_ecran);

mt.addImage(image_capture, 0); // Ajouter l'image à attendre
mt.waitForAll(); // Attendre que l'image soit prête

La capture est réalisée de manière asynchrone, ce qui explique l'utilisation de la classe java.awt.MediaTracker dans l'exemple précédent pour attendre que l'image soit prête à être utilisée.