Wie kann ich mit Imagemagick automatisch zuschneiden und dabei einen kleinen Rand beibehalten?

Wie kann ich mit Imagemagick automatisch zuschneiden und dabei einen kleinen Rand beibehalten?

Ich habe eine große Anzahl von Dateien mit einem Bild einer Münze auf schwarzem Filzhintergrund. Mit ImageMagick kann ich diese Bilder mit -trim und -fuzz ziemlich unkompliziert automatisch zuschneiden.

Die Kantenerkennung funktioniert gut. Ich würde gerne einen Parameter finden, der es mir ermöglicht, zu sagen: „Finde die Kante, aber gehe dann 10 Pixel zurück“, d. h., einen 10 Pixel breiten Umfang um die Münze beizubehalten, anstatt direkt daran entlang zu schneiden. Ich möchte keinen neuen Rand hinzufügen wie mit dem Befehl -splice, sondern diesen Abstand zum Originalbild beibehalten.

Bisher habe ich noch keine Möglichkeit gefunden, dies zu tun. Das Nächstliegende, was mir eingefallen ist, ist, es im Modus -trim info:- auszuführen, die Ausgabe zu erfassen und den Zuschnitt mit einem manuellen Zuschnitt neu zu berechnen, aber ich würde wirklich einen einstufigen Prozess bevorzugen.

Ich verwende ImageMagick unter Windows 10 und habe zwar die Bash-Erweiterungen installiert, jedoch keine Skripts darunter getestet. Eine Lösung, die ausschließlich die Imagemagick-Befehlszeile verwendet, wäre daher vorzuziehen.

Antwort1

Mangels einer eleganten Lösung habe ich mich für eine funktionierende entschieden und ein einfaches Bash-Skript geschrieben, das die Aufgabe gut zu erfüllen scheint. Dies lässt einen Versatz von 25 Pixeln rund um die Münze und verwendet die Originalgrafik als Hintergrund. Ich werde das irgendwann parametrisieren und bereinigen, aber es ist das funktionierende Skript für heute.

for f in *.jpg; do
    trimbox=$(convert $f -fuzz 25% -format "%@" info:)
    orig=$trimbox
    first=${trimbox%x*}
    trimbox=${trimbox#*x}
    second=${trimbox%%+*}
    trimbox=${trimbox#*+}
    third=${trimbox%+*}
    fourth=${trimbox#*+}
    #echo "trimbox: $orig first: $first second: $second third: $third fourth:$fourth"
    ((first+=50))
    ((second+=50))
    ((third-=25))
    ((fourth-=25))
    trimbox=$first"x"$second"+"$third"+"$fourth
    convert "$f" -crop "$trimbox" +repage "trimmed-$f"
done

Antwort2

Sie können hierfür -borderund verwenden. Für einen transparenten Rahmen benötigen Sie beispielsweise Folgendes:-bordercolor

for f in *.jpg; do
  convert -fuzz 25% -trim -border 25 -bordercolor none +repage $f trimmed-$f
done

Sehenhttp://www.imagemagick.org/Usage/crop/#border

verwandte Informationen