mit convert rekursiv Bildformate ändern

H

holgerw

Guest
Hallo,

diese Frage ist nicht so FreeBSD spezifisch, aber ich hoffe, sie doch in die passende Kategorie hier gepostet zu haben.

Ich habe einen Ordner /fotos mit zahlreichen Unterordnern.
In diesen Ordnern sind alle Fotos im Jpg-Format, allerdings haben manche die Endung *.jpg, manche *.jpeg, andere *.JPG

Mit convert aus dem Paket ImageMagick möchte ich nun mit einem Terminalbefehl alle Fotos in *.png umwandeln.

Wie stelle ich das am elegantesten an?

Im Gegensatz zu Soundkonverter, was rekursiv Audioformate ändern kann, ist selbst digikam mit der Stapelverarbeitung nicht in der Lage, ordnerübergreifend zu arbeiten, man muss ordnerweise vorgehen, was in meinem Fall sehr mühsam wäre.

Viele Grüße
Holger
 
Hallo Holger,
ich würde mal den Ansatz über die Shell versuchen, also ein find mit xargs.

Aber bedenke, dass das Umwandeln von einem datenreduzierten Format in ein anderes im Allgemeinen mit Qualitätsverlust einhergeht.
 
Hallo Holger,
ich würde mal den Ansatz über die Shell versuchen, also ein find mit xargs.

Aber bedenke, dass das Umwandeln von einem datenreduzierten Format in ein anderes im Allgemeinen mit Qualitätsverlust einhergeht.

Hallo @Rakor,

danke für den Hinweis mit find und xargs. Damit werde ich mal herum probieren und dann versuchen, ein kleines Script zu basteln.

Zur Vorsicht habe ich einen weiteren Ordner /fotos_png angelegt, und darein den ganzen Bilderkram kopiert. Falls was schief gehen sollte.

Zu den Formaten: Ich weiß, dass jpg kein verlustfreies Format ist, aber png ist verlustfrei, und wenn ich vor habe, nachträglich noch an den Fotos was zu bearbeiten, ist png doch die bessere Wahl. Und den jetzigen Qualitäts-Status Quo der Jpg-Bilder kann ich doch dann mit dem Umwandeln in png beibehalten (mir ist klar, dass durch das Umwandeln die Bilder nicht besser werden, aber die Situation wird dahin gehend besser, dass dann folgende Nachbearbeitungen nicht mehr zu Verschlechterungen führen).

Viele Grüße
Holger
 
Ungetestet, aber das müsste in etwa so gehen:
$ find /fotos -iname "*.jp*" -execdir convert "{}" "{}.png" \;

"Problem" ist jetzt nur noch, dass die Dateien jetzt eben .jpg.png, .jpeg.png .JPG.png heißen. Hier würde ich dann einfach mit einem renamer ein paar mal drüber laufen in ähnlicher weise. sysutils/rename vielleicht, aber damit hab ich noch nicht gearbeitet.
 
Gibt auch ne Lösung in Racket :-)

Code:
#lang racket

(define src-dir "/home/user/Bilder/")
(define dest-dir "/tmp")

; Zieldateiname (inkl. Zielpfad) zusammenstellen
(define (get-dest-file file)
  (build-path
     dest-dir
     (path-replace-extension (file-name-from-path file) #".png")))


; Suche im Ordner und Unterordner 
(for ([source-file (in-directory  src-dir)]
      #:when (regexp-match? #px"[.]jp[e]{0,1}g$" (string-downcase (path->string source-file))))
  (define cmd (format "convert ~a ~a" source-file (get-dest-file source-file)))
  (displayln cmd) ; convert-Aufruf anzeigen
  (system cmd) ; convert-Aufruf tätigen
  )

Eine mögliche Ausgabe könnte so aussehen:
convert /home/user/Bilder/20150723_171136.jpg /tmp/20150723_171136.png convert /home/user/Bilder/IMG-20150707-WA0010.jpeg /tmp/IMG-20150707-WA0010.png convert /home/user/Bilder/IMG-20150708-WA0004.jpeg /tmp/IMG-20150708-WA0004.png convert /home/user/Bilder/IMG_20150604_192848.jpg /tmp/IMG_20150604_192848.png convert /home/user/Bilder/coolpic_07.JPG /tmp/coolpic_07.png
 
...vielleicht hilfreich anstatt 'convert' das 'mogrify' tool aus ImageMagic zu benutzen. Damit überschreibt man die Orginaldatei.

$ mogrify -format png whatever.jpg ---> whatever.png

..ausnahmen bestätigen die Regel:) Es wir hier eine neue Datei *.png erzeuget. Doch vorsicht, jegliche schon existierende Datei dieses Namens wird überschrieben.
Info: http://www.imagemagick.org/Usage/basics/#mogrify
 
Zuletzt bearbeitet:
und wenn ich vor habe, nachträglich noch an den Fotos was zu bearbeiten, ist png doch die bessere Wahl
Nein, das ist nicht korrekt. PNG oder JPG-Dateien lassen sich beide nicht gut bearbeiten. Die Umwandlung jetzt kann, wenn überhaupt, nur eine Verschlechterung bringen aber nie eine Verbesserung. Du kannst später einfach direkt die JPG-Dateien bearbeiten und sie dann anschließend in dem Format speichern, was dir am besten passt.
 
Hallo holgerw.

Ich würde das Ganze einfach in eine for-Schleife packen.

Code:
#!/bin/bash
VERZ="find fotos/ -type d"

for DIR in $VERZ ; do
cd $DIR
for BILD in *.jpg *.jpeg *.JPG ; do
convert -monitor "$BILD" "${BILD%%,*}.tif"
cd $HOME
done
done
Die erste for-Schleife sucht nach den Unterverzeichnissen im Verzeichnis "fotos". Dann wird in das jeweilige Verzeichnis gewechselt und es werden die in dem Verzeichnis gefundenen Bilder, mit den Endungen 'jpg, jpeg, JPG', in das tif-Format umgewandelt. Es wird noch der jeweilige Dateinamen angepasst. Aus Bild.JPG wird Bild.tif.
Nach dem die Bilder im Verzeichnis bearbeitet wurden, wird in das Home-Verzeichnis gewechselt und das nächste Verzeichnis wird abgearbeitet.

Du solltest erst einen Testlauf durchführen. Ich übernehme keine Haftung. :-)

Grüße Jonas
 
ich trau mich ja nie, irgendein Script zu veröffentlichen. Ich kann nämlich nicht Scripte schreiben und stochere immer dann, wenn ich eines brauche, endlos herum und frickele was zusammen.
Nun veröffentliche ich hier mal das, was ich selbst mit convert mache. Die Bilder aus meinem Handy sind nämlich immer zu groß, um sie als Anhang in einer Mail zu benutzen und deshalb verkleinere ich die dann. Dazu erstelle ich im Ausgangsverzeichnis einen neuen Ordner "kleingemacht", in dem die verkleinerten Bilder landen. Sie behalten dann allerdings den Namen, auch die Endung.
Trotzdem kann es vielleicht hilfreich sein, zu sehen, wie das bei mir geht.
Zusammen mit dem Vorschlag @jonas_101 sollte sich auch für dich schnell eine einfache Lösung ergeben.

Aber, das Umwandeln nach png bringt (mir) wirklich keine Vorteile.
Ich dachte erst auch, dass png besser sei als jpg und wollte es vor Allem wegen der Lizenz als Standard nutzen, doch für meine Anwendungen hat png lediglich größere Dateien, macht aber nichts besser. Nur gelegentlich nutze ich, dass es auch Transparenz kann.

Code:
#!/bin/csh

#immer wiederkehrende Funktionen
ende ()
{
    echo ""
    echo "GOOD BYE !"
    sleep 3
    clear
    exit 0
}

IN=kleingemacht
#F ist der Faktor in Prozent
F=25

#B ist eine Liste mit Endungen
B="JPG jpg jpeg PNG png tiff"

##wo wollen wir spielen?
#auf dem Screen:
echo "von WO ab soll verkleinert werden?"
echo "es erfolgt kaum eine Prüfung!"
echo "und immer an eine Kopie der Daten denken!"
echo ""
echo "genauen Pfad eingeben, dort entsteht ""$IN"" "
##die Variable WO einlesen
echo ""
echo -n "-> "
read WO
##und prüfen
echo ""
[ ! -e "$WO" ] && echo ""$WO" gibt es gar nicht, Schluss ist." && ende
[ ! -d "$WO" ] && echo ""$WO" ist doch kein Verzeichnis! Und Schluss." && ende

Pfad=""$WO"/"
[ ! -e $Pfad$IN ] && mkdir -p $Pfad$IN && chmod 777 $Pfad$IN

echo " $Pfad$IN wurde nun angelegt."
echo ""

##die Variable F einlesen
echo "wir verkleinern auf "$F"%. Wenn das nicht gut ist, kann ein neuer Wert gesetzt werden:"
echo ""
echo -n "-> "
read E

[ "$E" != "" ] && F="$E"

echo ""
echo "OK. Wir wollen auf "$F"% verkleinern"

for e in $(echo "$B")
do
    for i in $(ls "$Pfad"*"$e")
    do
    namenow=$(echo "$i" | sed 's/^.*\///')
    /usr/local/bin/convert $i -resize "$F"% "$Pfad$IN"/"$namenow"
    done
done

ende
 
Code:
find /fotos -type f \
| egrep -i '\.jpe?g$' \
| while read file; do
   convert ... "${file}" "${file%.*}.png"
done
 
Ich dachte erst auch, dass png besser sei als jpg und wollte es vor Allem wegen der Lizenz als Standard nutzen
JPEG hat weder ein Lizenz noch ein Patentproblem.


, doch für meine Anwendungen hat png lediglich größere Dateien, macht aber nichts besser.
Qualität kann man natürlich nicht durch Umwandlung hinzugewinnen.

Was die Speicherplatzersparnis angeht:
Bilder mit klaren Linien/Flächen sind meist als PNG kleiner als JPEG. Zudem lässt sich ggf. noch die Anzahl der benutzten Farbwerte reduzieren, was noch mal erhebliche Zusatzeinsparungen bringen kann, weil dann die Bildinformation ansich schon kleiner wird.
Bei unregelmäßigen Bildern (Fotos etc.) ist JPEG besser.

Nur gelegentlich nutze ich, dass es auch Transparenz kann.
Ja. Das kann JPEG nicht.

ich trau mich ja nie, irgendein Script zu veröffentlichen.
Nur Mut. :-)
 
Hallo zusammen,

erstmal bin ich begeistert über so viel Interesse - und ich sollte mir vielleicht doch ein paar mehr Grundlagen in Sachen einfache Shell-Aufgaben aneignen, kann nicht schaden (und rekursiv etwas abarbeiten ist ja eigentlich noch eher eine leichtere Sache).

Vielen Dank für alle bisherigen Kommentare.

Natürlich werde ich nun die verschiedenen Vorschläge testweise an ein paar Ordnern samt UNterordnern mit Bildern durchgehen, aber wenn schon der Umwandlungsprozess von jpeg nach png zu Verschlechterungen führen kann, dann lass ich mein ursprüngliches Vorhaben wohl besser, und werde doch den Rat von @zuglufttier befolgen:
Nein, das ist nicht korrekt. PNG oder JPG-Dateien lassen sich beide nicht gut bearbeiten. Die Umwandlung jetzt kann, wenn überhaupt, nur eine Verschlechterung bringen aber nie eine Verbesserung. Du kannst später einfach direkt die JPG-Dateien bearbeiten und sie dann anschließend in dem Format speichern, was dir am besten passt.

Die verschiedenen Lösungsvorschläge sind für mich dadurch allerdings nun überhaupt nicht überflüsssig geworden. Sowas geht ja ebenfalls mit anderen Werkzeugen bzw. Formaten, z.B. wav nach flac, wav nach mp3, tiff nach png u.s.f.

Viele Grüße
Holger
 
und ich sollte mir vielleicht doch ein paar mehr Grundlagen in Sachen einfache Shell-Aufgaben aneignen, kann nicht schaden
Ja. Insofern sind die Beispiele von TCM und pit234a ja ganz hilfreich.
Mein Skript behalte ich dann für mich und das kommt mit ins Racket Kochbuch. :-)

dann lass ich mein ursprüngliches Vorhaben wohl besser, und werde doch den Rat von @zuglufttier befolgen
Vernünftige Entscheidung.
 
Zurück
Oben