IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Plus de capture en java sous gnome avec un robot


Sujet :

Java

  1. #1
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut Plus de capture en java sous gnome avec un robot
    Bonjour

    Quoi ? Quoi ? Quoi ? Qu'est-ce que j'apprends ? On ne peut plus faire, en java, de capture d'écran avec un simple createScreenCapture() d'un objet java.awt.Robot avec Gnome et Linux ? J'obtiens une belle image monochrome noire. Bizarre puisqu'il a compris la taille de mon écran.

    Comment palliez-vous le problème ? Ne me dites pas qu'il faut négocier avec l'API DBUS. Ou alors donnez un exemple fonctionnel.

    Merci de votre attention
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Avec du code et quelques infos supplémentaires quant a la version de Java utilise et celle de l'OS ça aurait été mieux.

    Le code suivant fonctionne très bien pour moi sur Windows 10 avec l'OpenJDK 20.0.1 mais produit effectivement un gros rectangle noir sur une VM Ubuntu 22 tournant dans Virtual Box avec LibericaJDK 18.0.2. Le problème persiste après un passage sur OpenJDK 20.0.1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package test.capture;
     
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.io.File;
    import java.io.IOException;
     
    public final class Main {
        public static void main(final String... args) {
            System.out.println(System.getProperty("java.version"));
            screenCapture();
        }
     
        public static void screenCapture() {
            try {
                final var robot = new Robot();
                final var env = GraphicsEnvironment.getLocalGraphicsEnvironment();
                final var devices = env.getScreenDevices();
                final int numberOfScreens = devices.length;
                for (int index = 0 ; index < numberOfScreens ; index++) {
                    final var device = devices[index];
                    final var mode = device.getDisplayMode();
                    final var bounds = device.getDefaultConfiguration().getBounds();
                    System.out.println(device.getIDstring());
                    System.out.printf("Min : (%f, %f) ; Max : (%f, %f)%n", bounds.getMinX(), bounds.getMinY(), bounds.getMaxX(), bounds.getMaxY());
                    System.out.printf("Width : %d ; Height : %d%n", mode.getWidth(), mode.getHeight());
                    final var rectangle = new Rectangle((int)bounds.getMinX(), (int)bounds.getMinY(), (int)bounds.getWidth(), (int)bounds.getHeight());
                    final var screen = robot.createScreenCapture(rectangle);
                    ImageIO.write(screen, "jpg", new File("screenshot-%d.jpg".formatted(index)));
                }
            } catch (IOException | AWTException ex) {
                ex.printStackTrace();
            }
        }
    }
    Le soucis ne semble pas être récent sous Linux car des problèmes similaires sont postés sur StackOverflow depuis quelques années. Il est fait mention, par exemple, que Robot n'est pas compatible avec Wayland.
    Il est possible de voir si Wayland est activé en faisant :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo $XDG_SESSION_TYPE
    wayland

    Il devrait être normalement possible de le désactiver en faisant :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sudo nano /etc/gdm3/custom.conf

    puis en dé-commantant la ligne WaylanlEnable=false dans la section [daemon] :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [daemon]
    # Uncomment the line below to force the login screen to use Xorg
    WaylandEnable=false

    Une fois la machine (ou GDM) redémarrée, on obtient :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo $XDG_SESSION_TYPE
    x11

    Et le même code Java produit alors une capture d’écran correcte.

    C'est bizarre car il me semblait avoir vu passer des messages il y a déjà quelques temps disant que ce soucis avait été corrigé. A moins que ça ne soit pour JavaFX (pas testé les captures avec FX quand Wayland activé).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Il y a un PR en cours: https://github.com/openjdk/jdk/pull/13803
    Mais sinon, on peut normalement choisir un autre type de session (càd Xorg et même une autre interface graphique) au login.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Quand même bizarre qu'ils mentionnent ScreenCast vu qu'il faut une autorisation préliminaire de l'utilisateur via une boite de dialogue et donc que ça semble pas bien approprie pour des tests automatises.

    J'ai fait un test équivalent en FX, marche OK sous Windows et X11, rectangle noir sous Wayland comme de bien entendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    package test.capture;
     
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.embed.swing.SwingFXUtils;
    import javafx.scene.robot.Robot;
    import javafx.stage.Screen;
    import javafx.stage.Stage;
     
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
     
    public class Main extends Application {
        public static void main(final String... args) {
            System.out.println(System.getProperty("java.version"));
            System.out.println(System.getProperty("javafx.version"));
            Application.launch(args);
        }
     
        public void start(final Stage stage) throws Exception {
            final var robot = new Robot();
            final var screens = Screen.getScreens();
            final int numberOfScreens = screens.size();
            for (int index = 0; index < numberOfScreens; index++) {
                final var screen = screens.get(index);
                final var fxImage = robot.getScreenCapture(null, screen.getBounds());
                var awtImage = SwingFXUtils.fromFXImage(fxImage, null);
                if (awtImage.getTransparency() == Transparency.TRANSLUCENT) {
                    final var awtOpaqueImage = new BufferedImage(awtImage.getWidth(), awtImage.getHeight(), BufferedImage.TYPE_INT_RGB);
                    final var g2d = awtOpaqueImage.createGraphics();
                    try {
                        g2d.drawImage(awtImage, 0, 0, null);
                    } finally {
                        g2d.dispose();
                    }
                    awtImage = awtOpaqueImage;
                }
                ImageIO.write(awtImage, "jpg", new File("screenshot-%d.jpg".formatted(index)));
            }
            Platform.exit();
        }
    }
    module-info.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    module dvp.fx {
        exports test.capture;
        requires javafx.graphics;
        requires javafx.swing;
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Déjà, merci pour votre intérêt et merci Bouve pour tes tests approfondis.

    C'est effectivement Wayland qui n'est pas conciliant. Et Wayland est maintenant par défaut. Je ne vais pas désactiver Wayland car X11 n'est même pas installé.

    Donner un accès à la session graphique à l'exécutable, comme c'est nécessaire pour d'autres applications, ne résout pas le problème.
    (export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session | head -n 1)/environ) && DISPLAY=:0.0 java monObjet)

    Du côté de xdotool et wmctrl, ils ne voient qu'un onglet Firefox. Alors que j'ai de nombreux onglets Firefox, une console et une application fenêtrée indépendante standard.

    Euh... Comme je ne veux pas être un vieux ronchon psycho-rigide qui ne veut pas changer, je vais d'abord étudier la nouvelle façon "Wayland", avant de revenir à X11.

    À suivre, donc.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Oui. Ou "Flameshot", qui est dans les dépôts, contrairement à grim. Il est dit fonctionner sous Wayland.

    Mais on s'éloigne de plus en plus de l'idée du robot java qui fait tout. En fait, je n'ai pas de solution pour cliquer. Ma conclusion est que, soit on veut faire un robot java comme avant, et on reste sous l'usine à gaz qu'est X11, soit on utilise Wayland qui ne supporte plus les robots (pour le meilleur et le pire).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/08/2009, 13h13
  2. lancer la console java sous windows avec le lancement d'un Jar
    Par wagui26 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 15/02/2009, 11h23
  3. Réponses: 2
    Dernier message: 14/01/2009, 09h48
  4. Procédure stockée java sous Oracle avec connexion vers Mysql
    Par chemical_seb dans le forum JDeveloper
    Réponses: 0
    Dernier message: 20/08/2008, 18h29
  5. execution d'une classe java sous windows avec ligne de commande
    Par rinuom dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 24/06/2008, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo