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
modifierLa 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
modifierLe 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
modifierEnregistrer 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
modifierLa 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.