So skalieren Sie mehrere Bilder auf dieselbe Größe

7

Ich habe mehrere Bilddateien in einem Verzeichnis. Diese Bilder haben eine ähnliche Größe und dieselbe Hintergrundfarbe.

Wie kann ich alle Bilder gleich groß machen, indem ich Hintergrund wie dieses angehängte Bild hinzufüge?

Geben Sie hier die Bildbeschreibung ein

Eisensand
quelle
Dies ist möglich (Hinweis: siehe -borderunter "Bildoperatoren" in man convert). Sie benötigen jedoch ein kurzes Programm, um dies zu tun, und ich werde es nicht in der Shell schreiben. Wenn Sie also bereit sind, eine Antwort in Perl mit zu akzeptierenImage::Magick , kann ich eine bereitstellen.
Goldlöckchen
Kennst du vorher die größten Dimensionen?
Jasper
@ TAFKA'goldilocks 'du brauchst eigentlich kein Skript.
Terdon
@terdon Das ist ein lächerlich absurder "Einzeiler", wenn Sie zuerst alle Bilder iterieren müssen, um die größte Geometrie zu finden.
Goldlöckchen
@ TAFKA'goldilocks 'stimmt, aber ich gehe davon aus, dass dies nur einmal durchgeführt werden muss oder dass das OP die Größe vorher kennt.
Terdon

Antworten:

10

Dies sollte mit allen Bildtypen arbeiten , dass ImageMagick ohne handhaben kann angeben *.png, *.jpg, *.jpegetc:

#!/bin/bash

images=$(identify -format '%f\n' * 2>/dev/null)

IFS=$'\n'
set -e

max_dims=$(
  identify -format '%w %h\n' $images 2>/dev/null |
  awk '($1>w){w=$1} ($2>h){h=$2} END{print w"x"h}'
  )

orig_dir=originals_$(date +%Y-%m-%d_%T)
mkdir "$orig_dir"
mv -- $images "$orig_dir"
cd "$orig_dir"

set +e

for image in $images; do
  convert -- "$image" -gravity Center -extent "$max_dims" "../$image"
done

Dadurch werden die Originalbilder in ein datiertes Verzeichnis verschoben, falls die Ergebnisse nicht erwünscht sind. Dies schlägt auch fehl, wenn die Bilddateien aus irgendeinem Grund Zeilenumbrüche in ihren Namen enthalten.

Dieses Skript könnte weitere Fehlermeldungen enthalten, um einen hilfreichen Hinweis zu geben, wenn ein Fehler aufgetreten ist. Wenn jedoch beim Verschieben der Bilder (alles zwischen set -eund set +e) ein Fehler auftritt , wird das Skript beendet. Hoffentlich wird dadurch irreversibler Schaden vermieden.

Aktualisieren

Jetzt mit awkSkript, das schamlos aus @ terdons Antwort plagiiert wurde .

Graeme
quelle
1
Ich würde dir eine +1 für "schamlos" geben, aber ich hatte dich schon vorher bewertet (und es war sowieso dein Vorschlag) :)
terdon
6

Solange Sie eine Zielgröße auswählen, die größer als Ihr größtes Bild ist, sollten Sie Folgendes tun:

mogrify -gravity Center -extent 200x200 -background white -colorspace RGB *png

Mit dem obigen Befehl wird die Originaldatei geändert. Möglicherweise möchten Sie eine Sicherungskopie erstellen , bevor Sie sie ausführen. Mit mogrifyImageMagick können Sie die Größe aller PNGs im aktuellen Verzeichnis auf 200 x 200 Pixel ( -extent 200x200) ändern, indem Sie einen weißen Hintergrund hinzufügen ( -background black) und das Bild zentrieren ( -gravity Center). Das -colorspace RGBwird benötigt, um Fehler wie zu vermeiden

mogrify.im6: Ignoring incorrect gAMA value when sRGB is also present `emacs-48x48.png' @ warning/png.c/MagickPNGWarningHandler/1754.

Um sicherzustellen, dass Sie keine Bilddaten verlieren, stellen Sie sicher, dass die von Ihnen verwendete Größe größer oder so groß ist wie das größte Bild, das Sie haben. Um so schnell zu kommen, versuchen Sie:

file *png | awk -F, '{print $2}' | sort -nu

Das sollte die Größe aller sortierten Bilder drucken und Sie können leicht die größten finden.


Um Goldlöckchen (: P) zu besänftigen, können Sie den gesamten Prozess automatisieren:

dimensions=$(file *png | cut -d, -f 2 | sort -u | 
            awk '($1>w){w=$1}($3>h){h=$3}END{print w"x"h}') && 
mogrify -gravity Center -extent $dimensions -background white -colorspace RGB *png; 
terdon
quelle
Bis zum Befehl "Datei", schön! Aber funktioniert diese Linie, um die größte Breite und Höhe leicht herauszufinden? Vielleicht sollten Sie die Größe x und y getrennt sortieren.
Jasper
@ Jasper in der Tat, das ist nur ein Hack, Quick'n Dirty®.
Terdon
+1 Für zumindest einige grundlegende Schritte;) @Jasper hast du auch meine Stimme bekommen, übrigens.
Goldlöckchen
@ TAFKA'goldilocks 'Ich verneigte mich vor dem Altar der Effizienz, siehe bearbeiten. Immer noch kein Skript: P.
Terdon
1
@Tetsu, meine Antwort sollte mit allen Bildtypen funktionieren, die ImageMagick verarbeiten kann.
Graeme
6

Ich nutzte die Gelegenheit, um meine Bash-Fähigkeiten zu verbessern und fand Folgendes:

#!/bin/bash

maxx=0
maxy=0

# find largest dimension
for file in *.jpg ; do
  dim=$(identify "$file" | awk '{ print $3 }')
  xdim=$(echo $dim | cut -f1 -dx)
  ydim=$(echo $dim | cut -f2 -dx)
  if [ $xdim -gt $maxx ] ; then
    maxx=$xdim
  fi
  if [ $ydim -gt $maxy ] ; then
    maxy=$ydim
  fi
done

mkdir bordered

# resize and store new images in new folder
for file in *.jpg ; do
  dim=$(identify "$file" | awk '{ print $3 }')
  xdim=$(echo $dim | cut -f1 -dx)
  ydim=$(echo $dim | cut -f2 -dx)

  xborder=$(( ($maxx - $xdim ) / 2 ))
  yborder=$(( ($maxy - $ydim ) / 2 ))

  convert "$file" -bordercolor black -border ${xborder}x${yborder} "bordered/$file"

done

Dies sollte den Trick tun: Zuerst werden alle Dateien durchlaufen (je nach Bedarf ändern), um die größte Breite und Höhe zu ermitteln, und dann erneut Schleifen, um die erforderlichen Ränder hinzuzufügen (das -bordercolor blackTeil entsprechend Ihren Anforderungen ändern ). Die neuen Dateien werden im Ordner "bordered" gespeichert.

Jaspis
quelle