View previous topic :: View next topic |
Author |
Message |
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Sat Mar 11, 2006 12:47 pm Post subject: Ordnung im Bilderchaos - Bildgrößen (und EXIF) auswerten |
|
|
Wer kennt das nicht, da hat man sich z.B. die Urlaubsbilder eines Freundes kopiert, durch Zufall die Kopie einer kompletten Website auf der Platte oder die 1GB-Karte der Kamera mal wieder auf Festplatte kopiert.
Ok, hier ein Beispiel wie wir scriptgesteuert Ordnung in das Chaos bringen und anhand der Bildgrößen oder andere EXIF-Daten die Bilder umbenennen/verschieben/konvertieren können.
Zuerst benötigen wir das Paket media-gfx/jhead, dieses stellt das Binary jhead zur Verfügung welches uns Informationen zu einem JPEG-Bild liefert, hier zwei Beispiele:
Code: | # jhead 1.jpg
File name : 1.jpg
File size : 53555 bytes
File date : 2004:10:19 11:46:11
Resolution : 1200 x 798 |
Code: | # jhead 100_0640.jpg
File name : 100_0640.jpg
File size : 1004144 bytes
File date : 2005:07:03 15:12:50
Camera make : EASTMAN KODAK COMPANY
Camera model : KODAK CX7330 ZOOM DIGITAL CAMERA
Date/Time : 2005:07:03 15:12:45
Resolution : 1524 x 2032
Flash used : No (auto)
Focal length : 5.6mm (35mm equivalent: 37mm)
Exposure time: 0.0040 s (1/250)
Aperture : f/5.6
ISO equiv. : 120
Whitebalance : Auto
Metering Mode: matrix
Exposure : Action program (based towards fast shutter speed) |
Nun können wir mit jhead ein wenig scripten und die Bilder z.B. entsprechend ihrer Auflösung behandeln. Das ganze sind nur Beispiele um zu zeigen was möglich wäre. Es gibt sicher noch mehr Einsatzgebiete, wie sortieren nach Datum, Kamera usw...
Als Ausgangspunkt benutze ich find, um auch einfach Unterordner mit einschliessen zu können. Das Grundkonstrukt sieht hierbei so aus, hier werden Bildgrößen ausgewertet:
Code: | find ./ -type f -iname '*.jpg' | while read file ; do
resolution=`jhead "${file}" | grep ^Resolution | cut -d ":" -f 2`
if [ "$resolution" != "" ] ; then # zur Sicherheit, wurde wirklich eine Größenangbe ermittelt
height=`echo $resolution | cut -d "x" -f 2 | sed -e "s/ //g"`
width=`echo $resolution | cut -d "x" -f 1 | sed -e "s/ //g"`
# hier kommt dann die weitere Verarbeitung des Bildes rein.
fi
done |
Zur weiteren Behandlung der Bilder können in obiges Beispiel u.a. eingefügt werden:
je nach Hoch- oder Querformat anders behandeln:
Code: | if [ $width -gt $height ] ; then
# spezielle Behandlunng von Querformatbildern
else
# spezielle Behandlunng von Hochformatbildern
fi |
oder Datei umbenennen. Größenangabe vorn:
Code: | mv "${file}" "`dirname ${file}`/${width}x${height}_`basename ${file}`" |
oder Datei umbenennen, Größenangaben hinten:
(funktioniert nur bei casesensitiver Dateiendung, hier *.jpg, nicht bei *.JPG)
Code: | mv "${file}" "`dirname ${file}`/`basename ${file} .jpg`_${width}x${height}.jpg" |
Alle Bilder welche Querformat sind und die Breite kleiner 640 Pixel löschen:
Code: | if [ $width -gt $height ] && [ $width -lt 640 ] ; then
rm "${file}"
fi |
Alle Bilder eines Tages (nach EXIF-Datum) in jeweils ein Verzeichnis ablegen, sinnvoll wenn man die Speicherkarte der Kamera nur selten leert
Code: | find ./ -type f -iname '*.jpg' | while read file ; do
date=`jhead "$file" | grep ^Date | cut -d ":" -f 2- | cut -d " " -f 2`
if [ "$date" != "" ] ; then # zur Sicherheit, wurde wirklich eine Datum ermittelt
YY=`echo $date | cut -d ":" -f 1`
MM=`echo $date | cut -d ":" -f 2`
DD=`echo $date | cut -d ":" -f 3`
test -d "/zielverzeichnis/${YY}-${MM}-${DD}" || mkdir "/zielverzeichnis/${YY}-${MM}-${DD}"
mv "${file}" "/zielverzeichnis/${YY}-${MM}-${DD}"
fi
done |
Viel Spaß beim scripten... Weitere Möglichkeiten und Scripte können natürlich gern gepostet werden. Auch eine Mitteilung über die Nützlichkeit dieser Anleitung würde den Autor freuen. |
|
Back to top |
|
|
erdinger n00b
Joined: 30 Sep 2006 Posts: 38
|
Posted: Sat Jan 13, 2007 9:55 pm Post subject: |
|
|
erst einmal herzlichen dank für dein post... und nun neve ich dich...
du hast folgenden code geschrieben, der mich sehr interessiert: Code: | find ./ -type f -iname '*.jpg' | while read file ; do
date=`jhead "$file" | grep ^Date | cut -d ":" -f 2- | cut -d " " -f 2`
if [ "$date" != "" ] ; then # zur Sicherheit, wurde wirklich eine Datum ermittelt
YY=`echo $date | cut -d ":" -f 1`
MM=`echo $date | cut -d ":" -f 2`
DD=`echo $date | cut -d ":" -f 3`
test -d "/zielverzeichnis/${YY}-${MM}-${DD}" || mkdir "/zielverzeichnis/${YY}-${MM}-${DD}"
mv "${file}" "/zielverzeichnis/${YY}-${MM}-${DD}"
fi
done |
leider bin ich auf dem gebiet der shell-programmierung (und groß- und kleinschreibung) eine null.
ich habe folgendes problem: ich benutze zum scannen einen hp photosmart 2600... bekomme keine gui damit zum laufen, ist aber auch nicht so wild, da die bilder auch per http zur verfügung gestellt werden... also habe ich folgendes skript geschieben:
Code: | cd ~/Documents/bilder/scans
wget http://192.168.100.171/scan/image1.jpg
|
das scannt das bild und packt es unter dem namen image1.jpg in obiges verzeichnis... das nächste bild heißt dann image1.jpg.1 dann image1.jpg.2 u.s.w => sehr bescheiden
ich hätte gerne:
- für jeden monat ein verzeichnis (das er ggf. anlegt) (format: ~/Documents/bilder/scans/YYYYMM)
- das bild umbenannt nach DDHHiiss.jpg
(YYYY: jahr, MM: monat, DD tag, HH: stunde, ii: minute, ss: sekunde)
das darf er natürlich erst machen, nachdem das bild zuende gescannt ist
es muß nicht gesucht werden, da das bild ja immer den gleichen namen hat
kannst du mir da helfen? _________________ I don't want to know how to copy rights. I want to know how to copy beer! |
|
Back to top |
|
|
erdinger n00b
Joined: 30 Sep 2006 Posts: 38
|
Posted: Sat Jan 13, 2007 9:56 pm Post subject: |
|
|
du antwortetest:
========================================== schnipp
Warum postest Du das ganze nicht im Forum? So hätte jeder was davon.
Kannst ja nachholen, hänge ich meine Antwort da nochmal dran
Ansonsten wäre des Rätzels Lösung meiner Meinung nach einfach wget dazu zu veranlassen das Bild passend abzupeichern (im "Oberverzeichnis" auszuführen)
Code: | mkdir `date +%Y%m` &> /dev/null # Umleitung nach dev/null, sonst gibts Fehlermeldung wenns schon existiert
wget http://192.168.100.171/scan/image1.jpg -O `date +%Y%m`/`date +%Y%m%d%H%M%S`.jpg |
========================================== schnapp
was ich hiermit getan habe
vielen dank dafür: dat funzt... _________________ I don't want to know how to copy rights. I want to know how to copy beer! |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Sat Jan 13, 2007 11:00 pm Post subject: |
|
|
So ists brav...
Also nochmal zur Erklärung an alle die jetzt bissl komisch schauen... er hatte per PN gefragt und ich schreib (wie man oben lesen kann) er kanns doch im Forum posten... |
|
Back to top |
|
|
gabelhonz Apprentice
Joined: 30 Aug 2004 Posts: 222 Location: 10010100111110011
|
Posted: Tue Jan 16, 2007 9:23 pm Post subject: |
|
|
Hi,
was mich immer nervt ist das viele Bilder immer Querbilder sind und ich sie immer manuelle drehen muss.
Zwar benutze viele php gallerien das Feature diese dann automatisch zu drehen aber ich guck sie mir als im eog an.
Habe mir da sowas zusammengebastelt:
Code: |
#!/bin/bash
LEFT="Right-Hand,Top"
RIGHT="Left-Hand,Bottom"
for i in `find $1 -type f -iname '*.jpg'`; do
ROTATE=`exiftags $i |grep "Image Orientation" |gawk '{print $3,$4}' | sed -e "s/ //g"`
if [ $ROTATE = $LEFT ]; then
convert -rotate "+90" $i $i
fi
if [ $ROTATE = $RIGHT ]; then
convert -rotate "-90" $i $i
fi
done
|
Das dreht mir dann alle meine Bilder richtig.
Was nicht so toll ist, das die exiftag Info immer noch die gleiche bleibt und nach nochmaligem ausführen des scriptes das Bild eben weitergedreht wird.
Weis nicht wie man das ändern könnte???
gruß gabelhonz _________________ Wenn Chuck Norris ins Wasser fällt, wird Chuck Norris nicht nass. Wasser wird Chuck Norris. |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Fri Jan 19, 2007 8:38 am Post subject: |
|
|
Reines Löschen des entsprechenden Exif-Wert sollte reichen, wenn Du das verschmerzen kannst. Evt. mußt Dein Script so anpassen, das es einfach nichts tut wenn dieser Exif-Wert nicht gesetzt ist. (Weiß nicht was exiftags zurückliefert wenn der nicht da ist, daher einfach mal testen.)
man jhead wrote: | -norot
Clears the rotation field in the Exif header without altering the image. Useful if the images were previously rotated without clearing the Exif rotation tag, as some image browsers will auto rotate images when the rotation tag is set. |
Code: | jhead -norot $image |
|
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|