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

Interfaces Graphiques en Java Discussion :

Egalité entre BuffuredImage


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Par défaut Egalité entre BuffuredImage
    Salut à tous...

    Est-ce que la méthode equals de la classe BufferedImage fonctionne bien ? J'essaye de tester l'égalité entre deux captures d'écran, mais ça me retourne toujours faux, sans que mes fenêtres/mon arrière plan/etc n'ait bougé d'un pouce entre les deux captures. C'est pas que j'ai pas envie de jouer au jeu des sept erreurs, m'enfin quand y en a pas...

    A titre indicatif, le énième test rapide que je viens de réaliser:
    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
    import java.awt.Rectangle;
    import java.awt.Robot;
    import javax.swing.ImageIcon;
     
    public class Test {
    	public static void main(String[] args) {
    		try {
    			Rectangle rect = new Rectangle(0, 0, 54, 54);
    			System.out.println(new Robot().createScreenCapture(rect).equals(new Robot().createScreenCapture(rect)));
    			Robot rob = new Robot(); //A tout hasard...
    			System.out.println(rob.createScreenCapture(rect).equals(rob.createScreenCapture(rect)));
    			System.out.println(new ImageIcon(rob.createScreenCapture(rect)).getImage().equals(new ImageIcon(rob.createScreenCapture(rect)).getImage()));
    		} catch (Exception e) { System.out.println(e); }
    	}
    }
    Me donne le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    seth@fadreils: java Test
    false
    false
    false
    Ce qui est, vous en conviendrez, assez surprenant. Je vous passe le screenshot (manuel) d'un affichage des deux images en question, mais elles sont à l'oeil parfaitement identiques..

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Par défaut
    Eh bah, en fait, je m'auto-réponds...

    Un ami plus coutumier que moi avec la langue de Shakespear et à qui j'avais exposé le problème avant de poster ici a trouvé cette page contenant les éléments de la solution.

    En fait, la méthode equals de BufferedImage n'est pas redéfinie, c'est toujours celle de Object qui se borne à tester l'égalité de référence (==, quoi).
    Donc, d'après le bout de code proposé dans la page ci-dessus, j'ai mis au point la méthode suivante:
    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
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBuffer;
     
    public class Test {
    	public static boolean areEquals(BufferedImage img1, BufferedImage img2) {
    		DataBuffer db1 = img1.getData().getDataBuffer();
    		DataBuffer db2 = img2.getData().getDataBuffer();
    		int size = db1.getSize();
     
    		if (size!=db2.getSize())
    			return false;
     
    		for (int i=0; i<size; i++)
    			if (db1.getElem(i)!=db2.getElem(i))
    				return false;
     
    		return true;
    	}
     
    	public static void main(String[] args) {
    		try {
    			Rectangle rect = new Rectangle(0, 0, 54, 54);
    			BufferedImage img1 = new Robot().createScreenCapture(rect);
    			BufferedImage img2 = new Robot().createScreenCapture(rect);
    			System.out.println(areEquals(img1, img2));
    			rect = new Rectangle(0, 0, 40, 40);
    			img2 = new Robot().createScreenCapture(rect);
    			System.out.println(areEquals(img1, img2));
    			rect = new Rectangle(54, 54, 54, 54);
    			img2 = new Robot().createScreenCapture(rect);
    			System.out.println(areEquals(img1, img2));
    		} catch (Exception e) { System.out.println(e); }
    	}
    }
    Qui me donne le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    seth@fadreils: java Test
    true
    false
    false
    Ce qui semble donc à première vue conforme. Il faudrait peut-être faire quelques tests supplémentaires, mais si c'est bon, ça mérite peut-être une entrée dans la FAQ ?
    Je passe le sujet en résolu, mais si quelqu'un à quelque chose à rajouter sur le sujet...

  3. #3
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Normal

    la méthode equals n'est pas redéfinie dans la classe BufferedImage, elle est héritée de Object qui ne renvoie true que si c'est le même object

    Va falloir coder l'algo à la main

    [EDIT] Grillé de peu

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

Discussions similaires

  1. Egalité entre chaine de caractère
    Par Invité dans le forum Qt
    Réponses: 13
    Dernier message: 05/02/2008, 21h12
  2. Egalité entre objet
    Par la debutante dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 27/08/2007, 22h47
  3. Egalité entre deux champs NULL ?
    Par AyaGizmo dans le forum SQL
    Réponses: 2
    Dernier message: 08/06/2007, 11h42
  4. .NET C# Egalité entre 2 instances
    Par mow dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/08/2006, 09h38
  5. [C++.NET] Egalite entre datatables
    Par raboin dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 06/06/2006, 15h59

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