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

SWT/JFace Java Discussion :

[SWT] Capture d'ecran


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut [SWT] Capture d'ecran
    Bonjour,

    Je developpe une application RCP et je voudrais faire une action de capture d'ecran de mon application.

    J'ai deja essayé avec la classe Robot, mais il fait une capture de l'ecran tel qu'il est et non de mon application. Du coup si la capture prend quelques secondes a se faire et que je change de fenêtre entre temps, il me prend la nouvelle fenêtre affichée. Et si j'ouvre une boite de dialogue pour choisir un fichier pour enregistrer mon image, la boite de dialogue ne se ferme pas assez vite et elle se retrouve sur ma capture.

    Est ce que quelqu'un connait une méthode permettant de capturer une "Vue", une "Perspective" ou un "WorkbenchWindow" eclipse (ou même un composite)

    Merci d'avance
    ++

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Salut,

    Voilà un bout de code pour prendre une capture d'image d'un widget table
    et pour l'enregistrer sur le disque :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    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.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Table;
    import org.eclipse.swt.widgets.TableItem;
     
     
    public class Snippet {
        public static void main(String[] args) {
            final Display display = new Display();
            final Shell shell = new Shell(display);
            shell.setText("Capture écran");
     
            final Table table = new Table(shell, SWT.MULTI);
            table.setLinesVisible(true);
            table.setBounds(10, 10, 100, 100);
            for (int i = 0; i < 9; i++) {
                new TableItem(table, SWT.NONE).setText("item" + i);
            }
     
            Button button = new Button(shell, SWT.PUSH);
            button.setText("Capture");
            button.pack();
            button.setLocation(10, 140);
            button.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    Point tableSize = table.getSize();
                    GC gc = new GC(table);
                    final Image image = new Image(display, tableSize.x, tableSize.y);
                    gc.copyArea(image, 0, 0);
                    gc.dispose();
     
                    ImageLoader imageLoader = new ImageLoader();
                    imageLoader.data = new ImageData[] {image.getImageData()};
                    imageLoader.save("C:/photo.jpg",SWT.IMAGE_JPEG);
     
                    image.dispose();
                }
            });
            shell.pack();
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) display.sleep();
            }
            display.dispose();
        }
     
    }
    En espérant t'avoir aidé,

    Laurent

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Je n'avais pas fait attention au constructeur de GC qui prend un composite en paramètre.

    Merci je vais tester tout ca et on verra ce que ca donne.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    J'ai essyé cette solution mais le probleme persiste, si une fenetre vien s'intercalé devant mon composant pendant la capture d'ecran, elle est prise avec.

    Je commence a croire que SWT n'a pas de solution prévu pour ce genre d'opération.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Mmh peux-tu m'envoyer le code source de ton application, que je regarde cela de plus prés ?
    Tu peux m'écrire à laurent.caron [chez] gmail point com

    Merci

    Laurent

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Voila le code de ma méthode permettant d'effectuer une capture d'ecran de ma fenetre.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    buttonSnap.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter()
    {
    	@Override
    	public void widgetSelected(org.eclipse.swt.events.SelectionEvent e)
    	{
    		try
    		{
    			boolean existingFile = true;
    			File file = null;
    			while (existingFile)
    			{
    				FileDialog dialog = new FileDialog(myShell, SWT.SAVE);
    				dialog.setFilterExtensions(new String[] { "*.png" });
    				String path = dialog.open();
     
    				if (path != null)
    				{
    					file = new File(path);
    					existingFile = file.exists();
    					if (existingFile)
    					{
    						MessageBox message = new MessageBox(myShell, SWT.YES | SWT.NO);
    						message.setMessage("Le fichier '" + file.getName()
    								+ "' existe déjà. Voulez-vous le remplacer ?");
    						int reponse = message.open();
    							existingFile = (reponse == SWT.NO);
    					}
    				}
    				else
    				{
    					file = null;
    					existingFile = false;
    				}
    			}
     
    			if (file != null)
    			{
    				int width = controlToSnap.getSize().x;
    				int height = controlToSnap.getSize().y;
    				Image image = new Image(myShell.getDisplay(), width, height);
    				GC gc = new GC(controlToSnap);
    				gc.copyArea(image, 0, 0);
     
    				// Enregistre l'image dans un fichier
    				ImageLoader imageLoader = new ImageLoader();
    				imageLoader.data = new ImageData[] { image.getImageData() };
    				imageLoader.logicalScreenWidth = image.getImageData().width;
    				imageLoader.logicalScreenHeight = image.getImageData().height;
    				imageLoader.save(file.getAbsolutePath(), SWT.IMAGE_PNG);
    			}
    		}
    		catch (Exception ex)
    		{
    			ErrorDialog.auto(ex);
    		}
    	}
    });
    C'est la fameuse FileDialog qui est prise dans le screenshot.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    J'ai peut être une solution

    Avant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GC gc = new GC(controlToSnap);
    Tu ajoutes un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    controlToSnap.update();
    Laurent

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Merci beaucoup Meddle,

    C'est exactement la ligne qui manquait.

    Par contre maintenant il me met un unsupported_format si j'utilise le PNG (ce qui ne se produisait pas avant). Si tu as une idée sur la raison de cette erreur elle est la bienvenue, sinon c'est pas grave je me contenterai du format BMP ou JPG.

    Encore merci
    ++

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Citation Envoyé par barbu0055
    Merci beaucoup Meddle,

    C'est exactement la ligne qui manquait.

    Par contre maintenant il me met un unsupported_format si j'utilise le PNG (ce qui ne se produisait pas avant). Si tu as une idée sur la raison de cette erreur elle est la bienvenue, sinon c'est pas grave je me contenterai du format BMP ou JPG.

    Encore merci
    ++
    Cool... Pour l'erreur PNG, je n'ai pas la moindre idée, désolé... Quelle version de SWT utilises-tu ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Debutant] [Info] Capture d'ecran
    Par Hirouchima dans le forum Multimédia
    Réponses: 11
    Dernier message: 05/09/2005, 23h56
  2. lire le backbuffer ? capture d'ecran?
    Par supergrey dans le forum DirectX
    Réponses: 1
    Dernier message: 14/08/2005, 20h01
  3. Logiciel pour la capture d'écran
    Par nice dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 24/05/2005, 21h09
  4. [débutant][capture d'ecran]
    Par Shooter dans le forum C++
    Réponses: 1
    Dernier message: 11/03/2005, 16h09
  5. Capture d'écran
    Par LeChip dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 23/06/2004, 11h57

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