2016-04-15 6 views
1

Ich verwende eine Software namens ImageMagick, die über Befehlszeileneingaben für Fotovergleiche verfügt und einen Wert ausgibt. Ich möchte diesen Ausgabewert für eine weitere Analyse in einer bestimmten Variablen speichern. Wie würde ich das tun? Hier ist der Befehl, den ich in der Kommandozeile ausführen würde:Capture-Ergebnis von ImageMagick im Vergleich zu einer Variablen

compare -metric MSE Picture1.jpg Picture2.jpg difference.png 

Dies wird die Pixeldifferenzen zwischen Bild 1 und Bild 2. Speichern Sie es als Differenz und Ausgang eine Anzahl von der Differenz vergleichen. Wenn es identisch ist, wird es 0 sein. Ich möchte in der Lage sein, diesen Wert in Bezug auf eine Variable zu erfassen.

+0

Dies ist eine wirklich grundlegende Operation in der Shell Skripting. Sie müssen natürlich zunächst ein Tutorial lesen. – Barmar

+2

Siehe: [Wie setze ich eine Variable, die der Ausgabe eines Befehls in Bash entspricht?] (Http://stackoverflow.com/q/4651437/3776858) – Cyrus

+0

Beim Shell-Scripting ist es wichtig, zwischen dem [stdout] _output_ eines Befehls zu unterscheiden. und sein _exit code_, die separate Aspekte sind. Im Nachhinein betrachtet: Was Sie suchen, ist der Exit-Code. – mklement0

Antwort

1

Verwenden Sie Befehlsersetzung.

+2

Das ist, was ich dachte, dass sie auch fragen, aber dann ["Das Vergleichsprogramm gibt 2 bei Fehler zurück, andernfalls 0 wenn die Bilder ähnlich sind oder 1, wenn sie sich nicht ähneln."] (Http://imageagick.org/script/compare .php) –

1

Das Ergebnis eines Befehls wird immer in $? sein. Stellen Sie sicher, dass Sie diesen Wert in einer anderen Variablen speichern, bevor Sie einen anderen Befehl ausführen, oder er wird überschrieben.

0

Oder verwenden Sie Backticks. AKA, substitution

variable=`compare -metric MSE Picture1.jpg Picture2.jpg difference.png` 

echo "$variable" 
+0

Dies sollte ein Kommentar zu [Barmars Antwort] (http://stackoverflow.com/a/36658287/45375) sein. Während die Backtick-Syntax in diesem einfachen Fall gut funktioniert, sollten Sie ihre Nachteile gegenüber der modernen '$ (...)' -Syntax angeben: . – mklement0

1

Befehl Wie in einem Kommentar von Ignacio Vazquez-Abrams erwähnt, compare berichtet tatsächlich die Ähnlichkeit Status über seinen Exit-Code, nicht über seine stdout ausgegeben.

Ignacio, in seiner eigenen Antwort, erwähnt auch, dass

  • die letzte Exit-Code der Leitgröße in speziellen $?
  • berichtet wird, es ist wert dass Exit-Code in einer Variablen sofort speichern, so dass nachfolgende Befehle es nicht überschreiben.

Auch Exit-Code 0 zeigt an, dass Bilder ähnliche, nicht identisch sind.

Hier ist ein Code-Snippet, das zeigt, wie der Exit-Code speichern und verarbeiten sie anschließend:

compare -metric MSE Picture1.jpg Picture2.jpg difference.png # add >/dev/null for no output 
ec=$? # save exit code 
case $ec in # evaluate exit code 
    0) 
    echo "images are similar" 
    ;; 
    1) 
    echo "images are dissimilar" 
    ;; 
    *) 
    echo "an unexpected error occured" 
    ;; 
esac 
1

für mich gearbeitet:

variable=$(compare -metric MSE Picture1.jpg Picture2.jpg difference.png 2>&1)

oder

variable=$(compare -metric MSE Picture1.jpg Picture2.jpg null: 2>&1)

Verwandte Themen