• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Bildformat mit imagemagick ändern

Altrocker

Member
Hallo,

ich möchte gerne eine große Anzahl von Bildern bearbeiten, mit folgenden Kriterien:


  • - Seitenverhältnis in 16:9 ändern (hierbei wird in kauf genommen, dass ggf. wichtige Bildinhalte abgeschnitten werden)
    - Komprimierung auf 1920x1080 Pixel

Dies ließe sich mit:
Code:
convert altes.jpg -resize 1920x1920 -gravity center -crop 1920x1080+0+0 +repage neues.jpg
(und entsprechender for-Schleife) bewerkstelligen.

Nun fände ich es cool, dass man dies nur für Fotos im Querformat durchführt. Hochformat-Fotos sollten nicht noch schmaler werden, nur in der Höhe entsprechend der Auflösung angepasst werden (also im Verhältnis *x1080)

Wäre dies mit Imagemagick auf ein Verzeichnis anwendbar? Oder ist hier Handarbeit angesagt?

Grüße

Altrocker
 
A

Anonymous

Gast
Altrocker schrieb:

  • - Seitenverhältnis in 16:9 ändern (hierbei wird in kauf genommen, dass ggf. wichtige Bildinhalte abgeschnitten werden)
    - Komprimierung auf 1920x1080 Pixel
    - Ablage der Kopien in einem neuen Verzeichnis
Sofern sich dieses nur auf Fotos im Querformat anwenden ließe, ware es das "Sahnehäubchen :roll:

Wäre dies mit Imagemagick auf ein Verzeichnis anwendbar? Oder ist hier Handarbeit angesagt?
Geht schon, die Handarbeit ist nur die kleine Schleife zu erstellen.
Allerdings sind ein paar mehr Informationen notwendig,
zB:
  • # Seitenverhältnis ändern. duch Abschneiden oder durch Formatänderung?
    Wenn Abschneiden, dann wo? nur an einer Seite oder ausgehend von der Mitte an beiden Seiten?
    # Wie sieht das Bildformat und die Bildgröße derzeit überhaupt aus? und haben alle Bilder das selbe Format, sind also mit der selben Kamera mit der selben Bildeinstellung erstellt?
    # Wenn das nur die Querformatigen Bilder betreffen sollte, müsste noch bekannt sein ob die Bildorientation sauber in den EXIF-Daten eingetragen ist, oder nicht, das ist abhängig von deiner Kamera?
zeig mal jeweils von einem quer- hochkantigen Bild

Code:
identify BILDNAME
identify -format '%[exif:orientation]' BILDNAME

robi
 
OP
A

Altrocker

Member
Hi Robi,

danke für Deine Antwort. Zu Deinen Fragen:
  • 1. Die meisten Fotos sind mit der gleichen Kamera aufgenommen; jedoch sind auch Bilder dabei, die andere aufgenommen haben und die ich in meine Sammlung integriert habe.
    2. Ich gehe mal davon aus, dass die Fotos beschnitten werden müssen, da ich keine Verzerrung der Proportionen möchte. Da ich nicht jedes Foto einzeln behandeln möchte, würde ich es wie oben beschrieben, oben und unten zu gleichen Teilen beschneiden.

Die identify-Ausgabe ist folgendermaßen (erstes Foto Quer- zweites Foto Hochformat):

Code:
ar@lx-mobil:~/Bilder/2010> identify P1000761.jpg 
P1000761.jpg JPEG 2816x1877 2816x1877+0+0 8-bit DirectClass 4.038MB 0.000u 0:00.000
ar@lx-mobil:~/Bilder/2010> identify -format '%[exif:orientation]' P1000761.jpg 
1
ar@lx-mobil:~/Bilder/2010> identify P1000762.jpg 
P1000762.jpg JPEG 2816x2112 2816x2112+0+0 8-bit DirectClass 2.469MB 0.000u 0:00.000
ar@lx-mobil:~/Bilder/2010> identify -format '%[exif:orientation]' P1000762.jpg 
6
ar@lx-mobil:~/Bilder/2010>

Gruß Altrocker
 
A

Anonymous

Gast
ok, damit lässt sich dann schon was anfangen. wird aber erst heute Abend was, vorher muss erst noch mit der Familie über den Weihnachtsmarkt, versprochen ist versprochen ;)

robi
 
A

Anonymous

Gast
So hab mich mal versucht. Allerdings funktioniert in meiner aktuellen ImageMagick Version das setzten der EXIF-Bildorientiereung nicht.
Damit kann ich das richtige Drehen nicht ausprobieren und richtig einstellen.
Der entsprechnede Abschnitt ist
Code:
# folgende Verzweigung der Orientation muss noch sauber angepasst werden
# kann ich leider im Moment nicht selbst testen
# siehe auch  http://www.imagemagick.org/Usage/photos/#orient
        case $ORIENT in
         5)  WINKEL="-90" ;;
         6)  WINKEL="90" ;;
        esac
müsstest du mal ein rechs-gedrehtes und ein links-gedehtes Bild aussuchen und schauen was die Orientierung dort für Werte ausspuckt und diese entsprechend dort bei dir anpassen.

Das Script
Code:
#!/bin/bash
# Script sucht alle auf ".jpg" endende Dateien im aktuellem Verzeichnis und konvertiert sie in 16 zu 9 Format.


# hier wird das Ausgabeverzeichnis festgelegt, Verzeichnis muss existieren
OUTDIR="./test"


#--------------------------------- Ende Konfiguration ----------------------------

typeset -i BREIT ORIENT HOCH SOLLHOCH DIFF_CUT

#Hauptschleife
for BILDFILE in *.jpg
do
     echo $BILDFILE
     BILDNAME=$(basename "$BILDFILE" ".jpg")
     FORMAT=$(identify -format '%w;%h;%[exif:orientation]' "$BILDFILE")
     BREIT=$(echo "$FORMAT" | cut -d";" -f1)
     HOCH=$(echo "$FORMAT" | cut -d";" -f2)
     ORIENT=$(echo "$FORMAT" | cut -d";" -f3)
     WINKEL=0
     if [ $ORIENT -eq 1 ]
     then
# BILD ist Breitformat
# wir schneiden oben und unten etwas weg
         SOLLHOCH=$BREIT*9/16
         DIFF_CUT=($HOCH-$SOLLHOCH)/2
         convert "$BILDFILE" -crop "$BREIT"x"$SOLLHOCH"+0+"$DIFF_CUT" +repage  -resize '1920!x1080!' -quality 99  "$OUTDIR"/"$BILDNAME".jpg
     else

# BILD ist nicht Breitformat oder gedreht,gespiegelt oder sonstiges
# wir drehen nur und passen die Bildgroesse an

# folgende Verzweigung der Orientation muss noch sauber angepasst werden
# kann ich leider im Moment nicht selbst testen
# siehe auch  http://www.imagemagick.org/Usage/photos/#orient
        case $ORIENT in
         5)  WINKEL="-90" ;;
         6)  WINKEL="90" ;;
        esac

        convert "$BILDFILE" -rotate "$WINKEL" -resize '1920x1080'  -quality 99 -orient TopLeft  "$OUTDIR"/"$BILDNAME".jpg
     fi
done
#-------------------------------------------------------------------------------------------------------------------------------------------

viel Spass

robi
 
OP
A

Altrocker

Member
Hi Robi,

ich bekomme neuerdings folgende Meldung:

Code:
scalierung.sh: 9: typeset: not found
scalierung.sh: 26: Syntax error: "(" unexpected (expecting "fi")

(ich habe das Script unter "scalierung.sh" gespeichert.)

Hast Du eine Idee, woran das liegen kann?

Gruß
Altrocker
 
A

Anonymous

Gast
Hast du das Script geändert? irgendwo ein Klammer oder eine Quotierung (") nicht richtig gesetzt? oder eventuell mit einem unbrauchbaren Editor für die Shell bearbeitet, Ich vermute mal du hast dir dabei irgendwelche Schmierzeichen (oft ist es "0xA0" NO-BREAK SPACE ) oder Windowszeilensprünge unbewusst eingebaut, so was ist dann der Tot für jedes Shellscript und nicht sofort zu erkennen.

Genau kann ich das so auch nicht nachvollziehen ohne deine Version des Scripts als Datei vor mir zu haben.

robi
 
OP
A

Altrocker

Member
Oh Sorry, klar, hätte das Script mal gleich mit anhängen sollen:

Code:
!/bin/bash
# Script sucht alle auf ".jpg" endende Dateien im aktuellem Verzeichnis und konvertiert sie in 16 zu 9 Format.

# hier wird das Ausgabeverzeichnis festgelegt, Verzeichnis muss existieren
OUTDIR="/home/user/export/"

#--------------------------------- Ende Konfiguration ----------------------------

typeset -i BREIT ORIENT HOCH SOLLHOCH DIFF_CUT

#Hauptschleife
for BILDFILE in *.jpg
do
        echo $BILDFILE
        BILDNAME=$(basename "$BILDFILE" ".jpg")
        FORMAT=$(identify -format '%w;%h;%[exif:orientation]' "$BILDFILE")
        BREIT=$(echo "$FORMAT" | cut -d";" -f1)
        HOCH=$(echo "$FORMAT" | cut -d";" -f2)
        ORIENT=$(echo "$FORMAT" | cut -d";" -f3)
        WINKEL=0
        if [ $ORIENT -eq 1 ]
        then
# BILD ist Breitformat
# wir schneiden oben und unten etwas weg
                SOLLHOCH=$BREIT*9/16
                DIFF_CUT=($HOCH-$SOLLHOCH)/2
                convert "$BILDFILE" -crop "$BREIT"x"$SOLLHOCH"+0+"$DIFF_CUT" +repage  -resize '1920!x1080!' -quality 99  "$OUTDIR"/"$BILDNAME".jpg
        else
# BILD ist nicht Breitformat oder gedreht,gespiegelt oder sonstiges
# wir drehen nur und passen die Bildgroesse an
# folgende Verzweigung der Orientation muss noch sauber angepasst werden
# siehe auch  http://www.imagemagick.org/Usage/photos/#orient
                case $ORIENT in
                5)  WINKEL="-90" ;;
                6)  WINKEL="90" ;;
                esac
        convert "$BILDFILE" -rotate "$WINKEL" -resize '1920x1080'  -quality 99 -orient TopLeft  "$OUTDIR"/"$BILDNAME".jpg
        fi
done

Ich hoffe, Du findest den Fehler. Ich habe "eigentlich" nichts geändert, nur evtl. die Bash-Version (Debian)
Code:
$ bash --version
GNU bash, Version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger <http://gnu.org/licenses/gpl.html>

Dies ist freie Software.  Sie darf verändert und verteilt werden.
Für dieses Programm besteht keinerlei Garantie.


Gruß
Altrocker
 
A

Anonymous

Gast
das script sieht soweit gut aus. bei mir funktioniert es auch,
einzig in der ersten Zeile
Code:
!/bin/bash
muss natürlich
Code:
#!/bin/bash
sein, aber das ist sicherlich ein Kopierfehler.

Allerdings sieht man so die eventuellen Schmierzeichen nicht. Hab das jetzt mit meinen Shells aufprobiert, kann den Fehler nicht reproduzieren.
mir fällt nur eines noch ein was du versuchen kannst, und zwar die Zeile mit dem typeset wie folgt ändern.

Code:
builtins typeset -i BREIT ORIENT HOCH SOLLHOCH DIFF_CUT
wenn das auch nichts hilft, muss das mal jemand mit einer solchen aktuellen Debian-Bash ausprobieren, keine Ahnung was dort abgeschaltet ist oder was in der neuen Bash anders sein soll, so eine aktuelle bash habe ich wohl derzeit noch nirgends auf meinen Rechnern.

robi
 
Oben