Wie man den Norden beschneidet und in ImageMagick mit morgify zentriert

923
Steven Jeffries

Gibt es eine Möglichkeit, ein Bild horizontal und nicht vertikal zentriert zu beschneiden? Zum Beispiel möchte ich ein Bild beschneiden lassen:

expected

Mit dem Befehl mogrify -crop 250x250 -gravity North cat.jpgbekomme ich jedoch:

gotted

Beachten Sie, dass ich dies in einem Stapel mit etwa 10.000 Bildern unterschiedlicher Größe machen werde. Daher kann ich nicht explizit einen exakten Bereich zum Zuschneiden auswählen.

2

2 Antworten auf die Frage

1
JakeGould

Ganz oben in meinem Kopf sollten Sie sich mathematisch mit Koordinaten befassen, die oben links beginnen 0,0(alias NorthWestin ImageMagick-Terminologie), damit Sie den Zuschneidebereich so positionieren möchten, dass er etwa so aussieht:

(width of image - width of crop area) / 2 

Sie könnten also mit Ihrem Beispielbefehl etwas Ähnliches machen mogrify:

mogrify -crop 250x250+[(width of image - 250)/2]+0 -gravity NorthWest cat.jpg 

Welches ist ein ziemlich schönes Konzept, aber keine nützliche Realität. Aber ich habe gerade ein bisschen experimentiert und habe das für ein Testbild gemacht:

CROP_W=250 CROP_H=250 IMG_W=$(identify -format %w test.jpg) X_OFFSET=$((($IMG_W-$CROP_W)/2)) mogrify -crop $x$+$+0 -gravity NorthWest test.jpg 

Da ImageMagick -gravitystandardmäßig verwendet wird NorthWest, können Sie dies vereinfachen, indem Sie die -gravityOption ganz wie folgt entfernen :

CROP_W=250 CROP_H=250 IMG_W=$(identify -format %w test.jpg) X_OFFSET=$((($IMG_W-$CROP_W)/2)) mogrify -crop $x$+$+0 test.jpg 

Nachdem ich dieses Konzept getestet hatte, habe ich dieses Bash-Skript ausprobiert und es funktioniert wie erwartet. Ändern Sie einfach den DIRECTORYWert so, dass er dem tatsächlichen Verzeichnis entspricht, in dem Sie vorgehen möchten. So echo mogrifykönnen Sie genau sehen, was passieren würde, wenn der Befehl ausgeführt würde. Entfernen Sie das echound lassen Sie das Skript dann los, wenn Sie mit den Ergebnissen zufrieden sind:

#!/bin/bash  # Set the crop width and height. CROP_W=250 CROP_H=250  # Set the directory to act on. DIRECTORY='/path/to/images'  # Use find to find all of the images; in this case JPEG images. find $ -type f \( -name "*.jpg" -o -name "*.JPG" \) |\ while read FULL_IMAGE_PATH do # Get the image width with identify. IMG_W=$(identify -format %w $)  # Calculate the X offset for the crop. X_OFFSET=$((($IMG_W-$CROP_W)/2))  # Run the actual mogrify command. # mogrify -crop $x$+$+0 $ echo mogrify -crop $x$+$+0 $  done 
Das scheint den Trick gemacht zu haben. Man könnte meinen, ImageMagick hätte eine NorthCenter-Gravitation oder so etwas. Steven Jeffries vor 8 Jahren 1
@StevenJeffries Ich dachte dasselbe vor etwa 5 Jahren für ein Kundenprojekt, an dem ich arbeitete. 5 Jahre später kein Würfel. Aber hey, die Mathematik funktioniert für diese Methode also nicht groß. JakeGould vor 8 Jahren 0
0
Wilbert

JakeGould gab eine funktionierende Lösung, aber ich denke, eine viel einfachere Lösung besteht nicht darin, ein Skript zu erstellen, sondern eine zweistufige Konvertierung zu verwenden. Verringern Sie zuerst die Höhe mit der Schwerkraft Nord auf 250 Pixel und dann die Breite mit der Schwerkraft Mitte auf 250 Pixel :

mogrify -gravity North -crop x250+0+0 cat.jpg mogrify -gravity Center -crop 250x250+0+0 cat.jpg 

Alternativ können Sie convert mit einem Nicht-jpg-Zwischenbild verwenden, um einen Qualitätsverlust aufgrund der zusätzlichen Konvertierung in jpg zu vermeiden:

convert -gravity North -crop x250+0+0 cat.jpg png:- | convert -gravity Center -crop 250x250+0+0 png:- cat.jpg