2017-06-21 1 views
1

ich dies mit zu vergleichen, um BufferedImageBufferedImage Vergleich seltsames Verhalten

private boolean compareImages(BufferedImage actualImage, BufferedImage expectedImage) { 
    for (int x = 0; x < expectedImage.getWidth(); x++) { 
     for (int y = 0; y < expectedImage.getHeight();y++) { 
      if (actualImage.getRGB(x, y) != expectedImage.getRGB(x, y)) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

Es funktioniert, wenn Bildtyp PNG, aber funktioniert nicht, wenn Bildtyp JPEG/JPG ist

Hier ist, wie Ich habe versucht, diesen Code auszuführen: -`

BufferedImage resizedImage = Scalr.resize(originalImage,50,50); 
ImageIO.write(resizedImage,new File("a.jpg")); 
BufferedImage bufferedImage = ImageIO.read(new File("a.jpg")); 
assertTrue(compareImages(resizedImage, bufferedImage)); 

Dies schlägt für JPG/JPEG und es ist seltsam.

PS: Ich bin mit dieser Bibliothek ‚Scalr‘ Bildern Redimensionierung von

+3

Wo initialisierst du 'actualImage' in' assertTrue (compareImages (actualImage, file)); '? Und 'a.jpg' funktioniert nicht, außer' a' hat ein 'String'-Feld namens' jpg'. –

+1

Was ist der Zweck dieses Codes? Sollte es gerade Pixel für Pixel (ohne Epsilon) vergleichen? Wenn Sie zB vergleichen. jpg und png, die aus demselben Quellbild erstellt wurden, wird Ihr Code nun anzeigen, dass sie unterschiedlich sind. Ist das das gewünschte Verhalten? –

+0

@AndyTurner gab es mehrere Tippfehler .. ich habe sie korrigiert .. – Harshil

Antwort

3

Denken Sie daran, dass JPEG-a, dann verlustbehaftetes Format ist ein Bild durchführen, um eine Datei im JPEG-Schreiben (es sagt kodiert), um das Bild ändern kann, es kann also nicht zum Original zurückkehren ...

+0

ohh .. Gibt es eine Möglichkeit, dass wir sicherstellen können, dass es nicht passiert? – Harshil

+2

@Harshil nicht jpeg verwenden. –

+0

@Harshil leider nicht. Auch wenn versucht wird, die Bildqualität auf 100% zu setzen, kann nicht garantiert werden, dass es zu keinem Verlust führt ... –