# Ordnung im Bilderchaos - Bildgrößen (und EXIF) auswerten

## slick

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:

```
# jhead 1.jpg

File name    : 1.jpg

File size    : 53555 bytes

File date    : 2004:10:19 11:46:11

Resolution   : 1200 x 798
```

```
# 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:

```
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:

```
if  [ $width -gt $height ] ; then 

   # spezielle Behandlunng von Querformatbildern

else

   # spezielle Behandlunng von Hochformatbildern

fi
```

oder Datei umbenennen. Größenangabe vorn:

```
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)

```
mv "${file}" "`dirname ${file}`/`basename ${file} .jpg`_${width}x${height}.jpg"
```

Alle Bilder welche Querformat sind und die Breite kleiner 640 Pixel löschen:

```
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

```
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.

----------

## erdinger

erst einmal herzlichen dank für dein post... und nun neve ich dich...

du hast folgenden code geschrieben, der mich sehr interessiert:

```
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:

```
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?

----------

## erdinger

du antwortetest:

========================================== schnipp

Warum postest Du das ganze nicht im Forum? So hätte jeder was davon.  :Wink: 

Kannst ja nachholen, hänge ich meine Antwort da nochmal dran  :Wink: 

Ansonsten wäre des Rätzels Lösung meiner Meinung nach einfach wget dazu zu veranlassen das Bild passend abzupeichern (im "Oberverzeichnis" auszuführen)

```
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...

----------

## slick

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...  :Wink: 

----------

## gabelhonz

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:

```

#!/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

----------

## slick

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. 

 

```
jhead -norot $image
```

----------

## slick

Weil es gut hier dazu paßt: Benutzung von convert - https://forums.gentoo.org/viewtopic-t-562727.html

----------

