2016-10-30 8 views
2

Ich versuche zwei Bilder zu vergleichen, die sich unter meiner OS-Maschine befinden. Ich habe ImageMagick auf meinem OS-Rechner laufen. und im mit dieser Methode:org.im4java.core.CommandException: magick: keine Bilder gefunden für Operation

public boolean compareImages (String expectedScreenShot, String capturedScreenShot, String pdiffCompare) { 
    ProcessStarter.setGlobalSearchPath("/usr/local/bin/"); 
    CompareCmd compare = new CompareCmd(); 
    // For metric-output 
    IMOperation cmpOp = new IMOperation(); 
    // Set the compare metric 
    cmpOp.metric("AE"); 
    // Add the expected image 
    cmpOp.addImage(expectedScreenShot); 
    // Add the current image 
    cmpOp.addImage(capturedScreenShot); 
    // This stores the difference 
    cmpOp.addImage(pdiffCompare); 
    try { 
    // Do the compare 
    compare.run(cmpOp); 
    compare.getErrorText(); 
    return true; 
    } 
    catch (Exception ex) { 
    return false; 
    } 
    } 

Ich verwende im4java: 1.4.0, aber wenn ich compare.run(cmpOp); im Empfang dieser Ausnahme laufen:

org.im4java.core.CommandException: org.im4java .core.CommandException: magick: Keine Bilder gefunden für Operation `-metric 'bei CLI arg 1 @ Fehler/operation.c/CLIOption/5225.

jede Hilfe wäre willkommen.

+0

Was sind die Werte von 'expectedScreenShot' und' capturedScreenShot'? Was ist eine Betriebssystemmaschine? –

+0

@Mark Setchell expectedScreenShot und capturedScreenShot sind der absolute Pfad der Bilder, die ich zwischen ihnen vergleichen möchte und Ja, es ist eine OS-Maschine expectedScreenShot = /Users/username/src/automation/test2/test.png captainScreenShot =/Benutzer/Benutzername /src/automation/test3/test.png – Youssef

+0

Wenn Sie die 'AE' wollen, müssen Sie einen Consumer für' stderr' mit 'compare.setErrorConsumer (StandardStream.STDERR) einrichten;' denke ich. –

Antwort

1

Ich war auch dieses auf Linux zu sehen, aber keine Fenster, mit IMJava Version 1.4 und ImageMagick 7.

Nach dem Graben und Debuggen Ich konnte dies umgehen, indem Sie die vergleichen Datei zu löschen (ein symbolischer Link Magick) und Dann kopiere Magick zurück über Vergleich (um den Symlink loszuwerden).

Noch ein paar Details für Neugierige: Wenn im4java bereit ist, den Befehl imagemagick auszuführen, führt es einen File.getCanonicalName auf dem Befehl aus (in diesem Fall 'compare') und dieser Aufruf kommt mit 'magick' zurück. Dann läuft im4java und ruft magick mit den Kommandozeilenparametern an, die vergleichen, erwartet und du bekommst die Ausnahme, die youssef gemeldet hat. Die obige Problemumgehung führt dazu, dass getCanonicalName nicht in 'magick' aufgelöst wird.

Bearbeiten, um Bernhards Frage zu beantworten, weil ich auch nicht kommentieren kann: Wenn Sie die Befehlszeile ausführen, generiert es Sie keine Fehler erhalten, da die Befehlszeile den 'vergleichen' Befehl verwendet. In der API wird stattdessen "magick" verwendet. Zum Beispiel funktioniert "compare -metric AE foo.png bar.png diff.png", aber "magick -metric AE foo.png bar.png diff.png" funktioniert nicht.

+0

Die Antwort oben hat uns sehr geholfen. Als Randnotiz - auch harte Links zu 'magick' statt Symlinks erstellen können, die es standardmäßig ist:' ln Magick compare' - stellen Sie sicher, für alle von ihnen, dies zu tun ('identify',' convert', usw.) – Aramir

1

Eigentlich ist dies ein Kommentar und keine Antwort, aber ich darf hier nicht kommentieren. Ich bin der Autor von im4java, aber ich habe momentan keine IM 7 auf meinem Rechner installiert. Ich werde versuchen, wenn möglich zu aktualisieren und einige Einblicke zu gewinnen.

Könnten Sie in der Zwischenzeit versuchen, die generierte Befehlszeile auszugeben (siehe im4java-docs) und diese Befehlszeile direkt zu versuchen? Bitte posten Sie das Ergebnis.

würde Eine andere Lösung, die convert-Befehl zu verwenden, -verbose so etwas wie convert file1.jpg file2.jpg -Metrik ae -compare diff.jpg

Dies schafft die Diff-Datei, aber meine Installation nicht schreibe die Metriken in stderr. Dies könnte das Problem sein, das Sie mit dem ErrorConsumer haben. In diesem Fall muss ImageMagick ihre Werkzeuge reparieren (magick ist nur ein neuer Name für Konvertieren).

Eine andere Möglichkeit wäre, zu GraphicsMagick zu wechseln.

+0

Danke für den Hinweis. Meine Arbeitslösung "convert" hinzuzufügen: op.addRawArgs ("convert"); Ist das deine beabsichtigte Lösung? –

Verwandte Themen