22 votes

Existe-t-il un moyen simple de comparer des instances de BufferedImage ?

Je travaille sur une partie d'une application Java qui prend une image sous la forme d'un tableau d'octets, la lit dans un fichier de type java.awt.image.BufferedImage et la transmet à une bibliothèque tierce pour traitement.

Pour un test unitaire, je veux prendre une image (d'un fichier sur disque) et affirmer qu'elle est égale à la même image qui a été traitée par le code.

  • Mon attendu BufferedImage est lu à partir d'un fichier PNG sur le disque en utilisant ImageIO.read(URL) .
  • Mon test lit le même fichier dans un fichier BufferedImage et l'écrit dans un tableau d'octets en PNG pour le fournir au système testé.

Lorsque le système testé écrit le tableau d'octets dans un nouveau fichier BufferedImage Je veux affirmer que les deux images sont égales d'une manière significative. En utilisant equals() (hérité de Object ) ne fonctionne pas (bien sûr). Comparaison de BufferedImage.toString() ne fonctionne pas non plus car la chaîne de sortie comprend des informations sur les références d'objets.

Quelqu'un connaît-il des raccourcis ? Je préférerais ne pas faire appel à une bibliothèque tierce pour un seul test unitaire dans une petite partie d'une grande application.

0voto

Je ne vois rien d'autre qu'un "do loop" par force brute :

  BufferedImage bi1, bi2, ...
   ...
  Raster r1 = bi1.getData();
  DataBuffer db1 = r1.getDataBuffer();
  if (db1.getSize() != db2.getSize ())
     ...
  for (int i = 0; i < db1.getSize(); i++) {  
    int px = db1.getElem(i);
  }

0voto

comonad Points 1852

Vous pouvez écrire cette image via imageio par le biais d'un OutputStream à un byte[] . Dans mon code, cela ressemble plus ou moins à ceci :

byte[] encodeJpegLossless(BufferedImage img){...using imageio...}
...
Assert.assertTrue(Arrays.equals(encodeJpegLossless(img1)
                               ,encodeJpegLossless(img2)
                               )
                 );

0voto

cyril Points 59

Fonctionne bien mais n'est pas efficace

public static boolean compareImage(File fileA, File fileB) {        
    try {
        // take buffer data from botm image files //
        BufferedImage biA = ImageIO.read(fileA);
        DataBuffer dbA = biA.getData().getDataBuffer();
        int sizeA = dbA.getSize();                      
        BufferedImage biB = ImageIO.read(fileB);
        DataBuffer dbB = biB.getData().getDataBuffer();
        int sizeB = dbB.getSize();
        // compare data-buffer objects //
        if(sizeA == sizeB) {
            for(int i=0; i<sizeA; i++) { 
                if(dbA.getElem(i) != dbB.getElem(i)) {
                    return false;
                }
            }
            return true;
        }
        else {
            return false;
        }
    } 
    catch (Exception e) { 
        e.printStackTrace();
        return  false;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X