Frage Batchprogramm unter linux für Forenbilder gesucht

Thread Status
Hello, There was no answer in this thread for more than 30 days.
It can take a long time to get an up-to-date response or contact with relevant users.
Anzeigen
(...)
Kannst du das in Lightroom automatisieren, so dass am Ende immer 1024 px an der langen Seite und eine Grösse von 249KB rauskommt? So dass die Kompression "dynamisch" angepasst wird? Es gibt in Darktable beim Export die Funktion "Dateigrösse beschränken auf ...". Vermutlich gibt es das auch in Lightroom. Ich habe aber noch nie versucht, diese Funktion im Batch zu nutzen.(...)

Das geht in Lightroom wunderbar und funktioniert auch im Batch! In Deinen anderen Ausführungen hast Du natürlich Recht, insbesondere was die Lizenzfreiheit angeht, aber komfortabel finde ich das trotzdem nicht!
 
Kommentar
input.jpg -> das muss der Name Deiner Datei sein.
output.jpg -> der Name der Ausgabedatei. Kann gleich input.jpg, also der Name Deiner Datei, sein -> die Datei wird also überschrieben mit der verkleinerten Version

Hm, ich wollte ja ein batchprogramm und nicht Datei für Datei skalieren und komprimieren, das kann ich auch mit gimp.
Also muss ich da vielleicht ein Platzhalterzeichen *.jpg nehmen?
Werde mal probieren, was geht.

Martin
 
Kommentar
Nein, Platzhalter geht nicht. convert, also der eigentliche Befehl, erwartet eine einzelne Datei als Parameter.
Wenn Du mal
Code:
man convert
im Terminal eingibst, siehst Du alle Optionen. Mit der "Q"-Taste kommst Du wieder aus der Anzeige raus. Diese Manual Seiten (daher man) gibt es übrigens für nahezu jedes Terminal Kommando auf Deinem System.

Die Lösung für Dein Problem ist eine For-Schleife.
Im Terminal kannst Du in Deinem Testverzeichnis den Befehl auch direkt eingeben
Code:
for BILD in *.jpg; do convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0.5+0.2 $BILD; done

Die For-Schleife erledigt die Arbeit für Dich und sie kennt auch Platzhalter. Sie geht hin und führt den Befehl convert (eingeleitet durch die Aufforderung "do") für jede einzelne jpg Datei in dem Verzeichnis (in dem die Schleife aufgerufen wurde) einzeln aus.
Hier werden also nicht viele Dateien an einen einzigen Befehl übergeben, sondern der Befehl für jede gefundene jpg Datei erneut ausgeführt. Für Dich als Anwender ist das Ergebnis aber das Gleiche -> alle Dateien werden verkleinert.
BILD ist dabei die Variable, d.h. hier schreibt die For-Schleife für jede gefundene jpg Datei den Dateinamen rein (for BILD in *.jpg).

Als Bash Script würde es so aussehen
Code:
#! /bin/bash
#
for BILD in *.jpg ; do
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0.5+0.2 $BILD
done

Viele Grüße
 
Kommentar
Jetzt habe ich das Skript häufiger in im Einsatz gehabt und mir ist aufgefallen, dass wenn ich -resize 900x900 setze, mir die Unscharfmaske mit -unsharp 0.5+0.2 zu stark war.

Bei der Reduktion von Bildern meiner V2 auf 900x900 haben mir die Ergebnisse mit -unsharp 0x1.6+0.4+0.039 am besten gefallen. Ausserdem habe ich so das etwas feinere Format verwendet, welches etwas mehr Kontrolle bietet und mich mit bekannten Werten arbeiten lässt. Siehe hier.

Das einfache Bash Skript sähe also wie folgt aus:

Code:
#! /bin/bash
#
for BILD in *.jpg ; do
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 $BILD
done

Ich würde allen, die das Skript ausprobieren, empfehlen, den Wert für -unsharp entsprechend anzupassen oder eigene Werte zu ermitteln (und vielleicht hier vorzuschlagen).
In den alten Posts kann ich es nicht mehr ändern.
 
Kommentar
Jetzt habe ich das Skript häufiger in im Einsatz gehabt und mir ist aufgefallen, dass wenn ich -resize 900x900 setze, mir die Unscharfmaske mit -unsharp 0.5+0.2 zu stark war.

Bei der Reduktion von Bildern meiner V2 auf 900x900 haben mir die Ergebnisse mit -unsharp 0x1.6+0.4+0.039 am besten gefallen. Ausserdem habe ich so das etwas feinere Format verwendet, welches etwas mehr Kontrolle bietet und mich mit bekannten Werten arbeiten lässt. Siehe hier.

Das einfache Bash Skript sähe also wie folgt aus:

Code:
#! /bin/bash
#
for BILD in *.jpg ; doP
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 $BILD
done



Ich würde allen, die das Skript ausprobieren, empfehlen, den Wert für -unsharp entsprechend anzupassen oder eigene Werte zu ermitteln (und vielleicht hier vorzuschlagen).
In den alten Posts kann ich es nicht mehr ändern.



Super, vielen Dank für die Infos. Urlaubsbedingt kann ich das erst in 2 Wo ausprobieren, sieht aber so aus, als ob das die Lösung ist.

Martin
 
Kommentar
Komisch: im ersten Anlauf schien es zu klappen, allerdings war die Endgröße häuig unter 200kb.
Nach Installation anderer Programme klappt es nun gar nicht mehr:

#! /bin/bash
#
for BILD in *.jpg ; doP
convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 $BILD
done

liefert nun Fehlermeldungen:

syntax error near unexpected token `doP'
./reduce.sh: line 3: `for BILD in *.jpg ; doP'

Habe das Skript ausführbar gemacht, in ein lokales Vergeichnis welches die JPGs enthält kopiert und rufe es dor auf mit ./reduce.sh
Schade, wäre die perfekte Lösung gewesen. Bin leider nicht fachkundig genug, um den Fehler zu finden,
 
Kommentar
Darf ich mal fragen, was gegen die Verwendung von Irfanview spricht?
Nur so aus reiner Neugierde (will eventuell demnächst mal einen alten Rechner mit Linux installieren und damit ein bisschen rumspielen).
Gruß,
Werner
 
Kommentar
copy and paste s. oben.
Hab ich nun korrigiert, Meldung: kann Progamm P nicht finden.
Irfanview für Linux gibt es nicht, mit Win-Emulsionen hab ich keine guten Erfahrungen gemacht, hab auch kein windoofs mehr auf der Platte.
Bei Einzelbildbearbeitung mit z.B. Gimp ist das kein Problem, aber eine Batchfunktion, welche in einem Rutsch Bilder eines ganzen Verzeichnisses in die passende Größe (Pixel- und Datengröße) bringt, wäre natürlich komfortabler. Es geht ganz sicher unter Linux, wenn man sich mit der Konsole nur besser auskennen würde.
So, nun habe ich es fast geschafft: es klemmte daran, dass mein jpg Format als JPG Format in Großbuchstaben geschrieben sind und das P nach dem do weg musste. Habe das Skript angepaßt und nun rennt es wunderbar schnell.


#! /bin/bash
#
for BILD in *.JPG ; do
convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 $BILD
done

Wenn mir jetzt noch jemand einen Trick verrät, wie man das Skript modifizieren muss, damit er die Originale nicht überschreibt, sondern Kopien mit Namensänderung erzeugt, bin ich glücklich.
Martin
 
Kommentar
copy and paste s. oben.

Da muss irgendwas beim Einfügen (paste) schief gelaufen sein. Oder ich habe nachträglich was verändert?! Im Original Beitrag steht es korrekt drinnen. Bei Deinem Quote meines Beitrages steht es auch falsch. Hast Du Deinen Quote kopiert und eingefügt oder aus meinem originalen Beitrag? Ist aber auch egal. Du hast es ja gelöst. Wenn Du übrigens die Fehlermeldung mal in Ruhe anschaust, siehst Du, dass Dir das System in recht deutlicher Sprache den Fehler benennt. Das ist in meinen Augen eine ganz große Stärke der bash. Nur falls Du zukünftig mal Bugs finden musst.

.
.
.
Das einfache Bash Skript sähe also wie folgt aus:

Code:
#! /bin/bash
#
for BILD in *.jpg ; do
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 $BILD
done



Hast es ja selber rausbekommen.
 
Kommentar
Wenn mir jetzt noch jemand einen Trick verrät, wie man das Skript modifizieren muss, damit er die Originale nicht überschreibt, sondern Kopien mit Namensänderung erzeugt, bin ich glücklich.
Martin

Kein Problem. Dafür muss man nur die Variable der Ausgabedatei etwas anpassen.

Code:
#! /bin/bash
#
for BILD in *.jpg ; do
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 ${BILD%.jpg}_web.jpg
done

Viel Spaß beim glücklich sein :D
 
Kommentar
Ich habe es jetzt noch einmal so angepasst, dass es egal ist, ob Du *.jpg oder *.Jpg oder *.JPG als Eingangsdatei hast. Ausgabe-Extension ist aber kleingeschrieben, also *.jpg

Code:
#! /bin/bash
#
for BILD in *.[Jj][Pp][Gg] ; do
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 ${BILD%.[Jj][Pp][Gg]}_web.jpg
done

Viel Spaß
 
Kommentar
Jetzt ist die Groß/Kleinschreibung der Dateiendung bei der Eingangsgröße egal und die Ausgabedatei hat die Schreibweise der Eingabedatei

Code:
#! /bin/bash
#
for BILD in *.[Jj][Pp][Gg] ; do
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 ${BILD%.[Jj][Pp][Gg]}_web.${BILD##*.}
done

Vielleicht geht es noch eleganter aber das Skript habe ich jetzt getestet und es macht was es soll.
Solltest Du übrigens mal vorsichtig einsteigen wollen mit etwas Skripterei, finde ich dieses Wiki bei den Ubuntuusers sehr hilfreich
 
Kommentar
Ich habe es jetzt noch einmal so angepasst, dass es egal ist, ob Du *.jpg oder *.Jpg oder *.JPG als Eingangsdatei hast. Ausgabe-Extension ist aber kleingeschrieben, also *.jpg

Code:
#! /bin/bash
#
for BILD in *.[Jj][Pp][Gg] ; do
  convert $BILD -define jpeg:extent=249kb -resize 900x900 -unsharp 0x1.6+0.4+0.039 ${BILD%.[Jj][Pp][Gg]}_web.jpg
done

Viel Spaß

Irre,wunderbar.
Läuft superschnell, Programmaufruf in Sekundenbruchteilen.

Klasse,
wenn ich das selbst könnte, würde ich sagen : typisch für Linux.
Das ist es zwar auch, aber mangels Zeit und zugegeben Interesse habe ich mich mit Bash-Scripten und Programmiermöglichkeiten zwar beschäftigt, hatte aber eine extrem flache Lernkurve, da ich das nur selten benutzte.

Dennoch vielen Dank, statt stundenlang im Internet nach fertigen Programmen zu suchen, hätte ich früher mal fragen sollen.

Martin
 
Kommentar
Dennoch vielen Dank, statt stundenlang im Internet nach fertigen Programmen zu suchen, hätte ich früher mal fragen sollen.

Gern geschehen. Ist ja auch schön zu sehen, dass man eben doch vieles mit Bordmitteln machen kann.

Wir haben uns übrigens in den Beiträgen überschnitten. In Beitrag #37 wird die Schreibweise der Eingangsdatei in der Ausgabedatei erhalten, sozusagen noch als letzte Verbesserung. An das Problem mit der Groß/Kleinschreibung hatte ich z.B. gar nicht gedacht.
 
Kommentar
-Anzeige-
Zurück
Oben Unten