gelöst: Erstelldatum- u. Zeit via convert ins Bild

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
herbaliz
Beiträge: 7
Registriert: 27.02.2005 13:37:25

gelöst: Erstelldatum- u. Zeit via convert ins Bild

Beitrag von herbaliz » 27.02.2005 13:46:57

Hallo,

habe ein Script, das mir mittels convert Miniaturen von Digitalfotos in ein Unterverzeichnis schreibt und Dateinamen und -datum grafisch ins Bild schreibt. Nun möchte ich nicht Dateidatum u. -zeit reinschreiben, sondern die Erstellzeit aus den ausgelesenen EXIF-Daten des Digitalfotos.

Letztere kann ich auf der Konsole z.B. mit diesem Befehl ausgeben lassen:

Code: Alles auswählen

exif -t 'Datum und Uhrzeit' Dateiname | grep Value | uniq | sed 's/   Value: //'
Ausgabe: 2005:02:26 12:18:44

Frage 1:
Wie kann ich das Datum so umformatieren, dass es der deutschen Notation entspricht?

Frage 2:
Wie kann ich obigen Befehl (nennen wir ihn ERSTELLZEIT) in mein lauffähiges Script integrieren, das derzeit nur Dateinamen und Dateidatum grafisch ergänzt?

Hier mein Script:

Code: Alles auswählen

#!/bin/bash
set -XV
basedir=.
datum=$(date -I +%x)
dat=$(date +%d.%m.%G_%H:%M)
subdir=$1
#subdir=$(date -I +%g%m%d-%H%M)$1
target=$basedir/$subdir
mkdir $target
mkdir $target/klein
cp *.jpg *.JPG $target
cd $target
for i in *.jpg *.JPG;
do
echo "process $i";
convert -size 448x448 -geometry 448x448 -fill "#bbddff" -draw "rectangle 0,0 125,8" -fill "#bbddff" -draw "rectangle 0,328 125,337" -font helvetica -pointsize 10 -fill black -draw "text 5,8 '$ERSTELLZEIT'" -font helvetica -pointsize 10 -fill black -draw "text 5,336 '$dat'" -mattecolor "#ffffff" -frame 6x6 -mattecolor "#0000ff" -frame 2x2 $i ./klein/$i;
done
Würde mich über Tipps sehr freuen.

Grüße,
Herb
Zuletzt geändert von herbaliz am 28.02.2005 00:24:04, insgesamt 1-mal geändert.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 27.02.2005 17:04:57

herbaliz hat geschrieben: Wie kann ich das Datum so umformatieren, dass es der deutschen Notation entspricht?
Ist einwenig angewachsen, dachte das wäre einfache :)

Code: Alles auswählen

gms@gms1:~$ perl -MPOSIX -e '@d=split(/[: ]+/,shift);print strftime("%c",$d[5],$d[4],$d[3],$d[2],$d[1]-1,$d[0]-1900);' "2005:02:26 12:18:44"
Sam 26 Feb 2005 12:18:44 CET
Das Datum kannst du dafür fast beliebig formatieren. Mit "%c" wird die bevorzugte Datums- und Uhrzeit-Repräsentation laut Einstellungen der momentanen Locale ausgewählt. Für andere Einstellungen siehe "man strftime"
herbaliz hat geschrieben: Wie kann ich obigen Befehl (nennen wir ihn ERSTELLZEIT) in mein lauffähiges Script integrieren, das derzeit nur Dateinamen und Dateidatum grafisch ergänzt?
Diese Frage verstehe ich nicht ganz, wo siehst du hier ein Problem ?

herbaliz
Beiträge: 7
Registriert: 27.02.2005 13:37:25

Beitrag von herbaliz » 27.02.2005 17:17:35

gms hat geschrieben:
herbaliz hat geschrieben: Wie kann ich obigen Befehl (nennen wir ihn ERSTELLZEIT) in mein lauffähiges Script integrieren, das derzeit nur Dateinamen und Dateidatum grafisch ergänzt?
Diese Frage verstehe ich nicht ganz, wo siehst du hier ein Problem ?
Sorry, ich verstehe leider nur sehr wenig von Bash Programmierung. Mein Script läuft nach dem Muster for i in *.jpg do ... done. Der Convert-Befehl ackert sich also so lange durch die jpg-Dateien, bis alle durch sind. Die Schleife übergibt jeweils den Dateinamen.

Wie schachtele ich den exif-Befehl und den ganzen Rest in diese Schleife rein? Auch hier soll ja jeweils Dateibezogen gearbeitet werden.

Dachte, es ginge irgendwie so:

for i in *.jpg do
convert -draw "text 5,8 'STRING'"
done

Für STRING dann etwa exif -t 'Datum und Uhrzeit' DATEINAME | grep Value | uniq | sed 's/ Value: //' ergänzt um das netterweise von dir geschriebene Codefragment.

Kann ich dort, wo DATEINAME steht die Variable $i einach noch einmal abgreifen? Und in welche Zeichen muss ich den kompletten Ausdruck dann einschließen? Oder denke ich viel zu kompliziert?

Schon mal herzlichen Dank für deine HIlfe,

Herb

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 27.02.2005 17:54:16

herbaliz hat geschrieben:Sorry, ich verstehe leider nur sehr wenig von Bash Programmierung.
Das Script hat für mich schon ziemlich professionell ausgeschaut :)

in der for-Schleife kannst du praktisch genauso "arbeiten", wie außerhalb und $i kannst du sooft verwenden wie du möchtest. Den ";" brauchst du nur wenn du mehrere Kommandos in einer Zeile verwenden möchtest.

Also etwa so:

Code: Alles auswählen

for $i in *.jpg do 
  ERSTELLZEIT=$(exif -t 'Datum und Uhrzeit' $i | grep Value | uniq | sed 's/   Value: //')
  ERSTELLZEITDE=$( perl -MPOSIX -e '@d=split(/[: ]+/,shift);print strftime("%c",$d[5],$d[4],$d[3],$d[2],$d[1]-1,$d[0]-1900);' "$ERSTELLZEIT")
  convert -draw "text 5,8 "$ERSTELLZEITDE"" $i ./klein/$i
done

herbaliz
Beiträge: 7
Registriert: 27.02.2005 13:37:25

Beitrag von herbaliz » 27.02.2005 18:35:42

hmm, irgendwo ist noch der wurm drin. es wird folgende fehlermeldung ausgegeben:

Code: Alles auswählen

line 2: syntax error near unexpected token `ERSTELLZEIT=$(exif -t 'Datum und Uhrzeit' $i | grep Value | uniq | sed 's/   Value: //')'

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 27.02.2005 19:05:04

wenn die Dateinamen Leerzeichen enthalten mußt du $i wie hier verwenden:

Code: Alles auswählen

ERSTELLZEIT=$(exif -t 'Datum und Uhrzeit' "$i" | grep Value | uniq | sed 's/   Value: //')
wahrscheinlich war das der Fehler, oder ?

herbaliz
Beiträge: 7
Registriert: 27.02.2005 13:37:25

Beitrag von herbaliz » 27.02.2005 22:36:48

nö, die Dateinamen entsprechen denen, die die Digitalkamera generiert - sie enthalten keine Leerzeichen. Habe dennoch $i mit Gänsefüßen umschlossen, immer noch Fehlermeldung:

Code: Alles auswählen

ich@erde:~/grafiken/test$ ./knipsdatum.sh
./knipsdatum.sh: line 2: syntax error near unexpected token `ERSTELLZEIT=$(exif -t 'Datum und Uhrzeit' "$i" | grep Value | uniq | sed 's/   Value: //')'
./knipsdatum.sh: line 2: `  ERSTELLZEIT=$(exif -t 'Datum und Uhrzeit' "$i" | grep Value | uniq | sed 's/   Value: //')'
pit@p2000:~/grafiken/test$
Ziemlich nett von dir, mir so geduldig zu helfen ;-)

r

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 27.02.2005 22:49:32

poste bitte einmal das komplette Script, diese Zeile ist allein betrachtet syntaktisch völlig richtig.

herbaliz
Beiträge: 7
Registriert: 27.02.2005 13:37:25

Das funktionsfähige Script

Beitrag von herbaliz » 27.02.2005 23:26:36

gms hat geschrieben:poste bitte einmal das komplette Script, diese Zeile ist allein betrachtet syntaktisch völlig richtig.
ich glaube, die Schleife war nicht korrekt fomuliert.

Alt:
for i in *.jpg do

Neu:
for in in *.jpg;
do
... ;
done

Das komplette Script für alle, die's interessiert. Benötigt wird convert (Bestandteil von imagemagick), exif, grep, sed, perl.

Von allen jpgs in einem Verzeichnis werden Miniaturen (448 Pixel Breite) mit Rahmen versehen und mit farbig unterlegtem Text ausgestattet in ein neues Unterverzeichnis ./klein geschrieben. Die Originale bleiben unangetastet. Text: Datum und Uhrzeit der Fotoerstellung (aus den EXIF-Daten ausgelesen), bis zu drei Worte aus der Befehlsfolge, Dateiname. Wenn das script mini.sh heisst, lautet ein Aufruf z.B. so:
./mini.sh Wort1 Wort2 Wort3

Nett wäre noch das Auslesen der Orientierung des Bildes (Querformat/Hochformat) aus den EXIF-Daten, daraus eine Bedingung, die Hochformate um 90 Grad dreht.

Das vollständige Script:

Code: Alles auswählen

#!/bin/bash
mkdir klein
for i in *.jpg;
do
ERSTELLZEIT=$( exif -t 0x132 $i | grep Value | uniq | sed 's/  Value: //')
MAN=$( exif -t 0x10f $i | grep Value | uniq | sed 's/  Value: //')
MOD=$( exif -t 0x110 $i | grep Value | uniq | sed 's/  Value: //')
ERSTELLZEITDE=$( perl -MPOSIX -e '@d=split(/[: ]+/,shift);print strftime("%c",$d[5],$d[4],$d[3],$d[2],$d[1]-1,$d[0]-1900);' "$ERSTELLZEIT")
convert -size 448x448 -geometry 448x448 -fill "#bbddff" -draw "rectangle 0,0 150,8" -fill "#ccc" -draw "rectangle 0,317 150,327" -fill black -draw "text 5,325 '$1 $2 $3'" -fill "#bbddff" -draw "rectangle 0,327 150,337" -fill "#f28e12" -draw "rectangle 0,8 150,16" -font helvetica -pointsize 10 -fill black -draw "text 5,8 '$ERSTELLZEITDE'" -font helvetica -pointsize 10 -fill black -draw "text 5,16 '(PKü) $MAN $MOD'" -font helvetica -pointsize 10 -fill black -draw "text 5,334 '$i'" -mattecolor "#ffffff" -frame 6x6 -mattecolor "#0000ff" -frame 2x2 $i ./klein/$i;
done
@gms Herzlichen Dank für deine Hilfe.
R.

Benutzeravatar
gloom
Beiträge: 272
Registriert: 30.07.2004 15:31:40
Wohnort: Berlin

Beitrag von gloom » 28.02.2005 14:20:00

erst einmal danke für das Script, denke ich werde es auch gut benutzen können.

Zu der Orientierung: soweit ich weiss wird diese nicht von der Kamera aufgezeichnet (bei meiner zumindest nicht), Gibt es profissionelle Kameras die das machen ???

edit: aha, bin etwas schlauer. Laut der Spezifikation kann auch die Orientierung des Bildes aufgezeichnet werden. siehe Spezifikation. Da gibt es aber auch Sachen, wie den Standpunkt per gps usw. Also viele Sachen die vorgesehen sind, ob das aber bis jetzt eine Kamera unterstützt weiss ich nicht.

herbaliz
Beiträge: 7
Registriert: 27.02.2005 13:37:25

Beitrag von herbaliz » 28.02.2005 16:17:13

gloom hat geschrieben:Zu der Orientierung: soweit ich weiss wird diese nicht von der Kamera aufgezeichnet (bei meiner zumindest nicht), Gibt es profissionelle Kameras die das machen
würde auch vermuten, dass das nicht alle kameras in die exif-daten schreiben. habe eine dienstliche und eine private. die erste (sony cybershot) macht's, bei der anderen müsste ich's prüfen. auch scheinen mir die feldbezeichnungen in den exif-daten nicht einheitlich zu sein, d.h., ein script das solche dinge auswertet, müsste kamera-spezifisch angepasst werden (was in diesem punkt natürlich nur ein minimaler aufwand wäre). einfach mal mit exif dateiname alle exif-daten ausgeben lassen und gucken, ob die felder übereinstimmen.

h

Benutzeravatar
gloom
Beiträge: 272
Registriert: 30.07.2004 15:31:40
Wohnort: Berlin

Beitrag von gloom » 28.02.2005 17:45:52

herbaliz hat geschrieben: auch scheinen mir die feldbezeichnungen in den exif-daten nicht einheitlich zu sein,
mh. eigentlich sollten die schon einheitlich sein (hab den genauen Bezeichner "Orientation" auch in dem Exif 2.2 pdf gelesen - S.54 [Nummerierung] bzw 60 [wirkliche Nummer]), deswegen gibt es ja die Spezifikationen (siehe link in meinen vorigen Post), obwohl en paar Abweichungen leider auch auf der Seite zu finden sind...

naja, so ist es aber auch schon recht nützlich das Skript. Die richtige Orientierung machen glaube ich auch Fotodienste auf ihren Fotoindex nicht...

herbaliz
Beiträge: 7
Registriert: 27.02.2005 13:37:25

Beitrag von herbaliz » 03.03.2005 08:43:56

gloom hat geschrieben:mh. eigentlich sollten die schon einheitlich sein (hab den genauen Bezeichner "Orientation" auch in dem Exif 2.2 pdf gelesen - S.54 [Nummerierung] bzw 60 [wirkliche Nummer]), deswegen gibt es ja die Spezifikationen (siehe link in meinen vorigen Post), obwohl en paar Abweichungen leider auch auf der Seite zu finden sind...
habe einmal die exifdaten von bildern verglichen, die ich mit verschiedenen kameras gemacht habe. man müsste sich natürlich das programm exif mal genauer angucken, die ausgabe sind ja vermutlich keine rohdaten, sondern aufbereitete daten. ob das programm sich unterscheidende feldbezeichner jeweils einheitlich übersetzt, müsste man prüfen. wenn nicht, sind zumindest die daten der mir zur verfügung stehenden kameras identisch (beide sony).

Code: Alles auswählen

EXIF tags in 'dsc00001.jpg' ('Intel' byte order):
--------------------+----------------------------------------------------------
Tag                 |Value                                                     
--------------------+----------------------------------------------------------
Bildbeschreibung    |                                                          
Hersteller          |SONY                                                      
Modell              |CYBERSHOT                                                 
Orientierung        |oben - links                                              
Auflösung in x-Richt|72,00                                                     
Auflösung in y-Richt|72,00                                                     
Maßeinheit der Auflö|Inch                                                      
Datum und Uhrzeit   |2005:02:25 17:33:40                                       
YCbCr Positionierung|co-sited                                                  
Kompression         |JPEG Kompression                                          
Hersteller          |SONY                                                      
Modell              |CYBERSHOT                                                 
Orientierung        |oben - links                                              
Auflösung in x-Richt|72,00                                                     
Auflösung in y-Richt|72,00                                                     
Maßeinheit der Auflö|Inch                                                      
Datum und Uhrzeit   |2005:02:25 17:33:40                                       
Belichtungszeit     |1/39 sec.                                                 
FNumber             |f/2,2                                                     
ExposureProgram     |Normalprogramm                                            
ISO Speed Ratings   |100                                                       
Exif Version        |Exif Version 2.1                                          
Datum und Uhrzeit (o|2005:02:25 17:33:40                                       
Datum und Uhrzeit (d|2005:02:25 17:33:40                                       
ComponentsConfigurat|Y Cb Cr -                                                 
Compressed Bits per |2,00                                                      
Exposure Bias       |0,0                                                       
MaxApertureValue    |2,06                                                      
Metering Mode       |Pattern                                                   
Lichtquelle         |0                                                         
Blitz               |Blitz löste aus.                                          
Focal Length        |9,7 mm                                                    
Anmerkungen des Hers|54 Byte(s) unbekannte Daten                               
FlashPixVersion     |FlashPix Version 1.0                                      
Color Space         |sRGB                                                      
PixelXDimension     |2560                                                      
PixelYDimension     |1920                                                      
Dateiquelle         |DSC                                                       
Scene Type          |(null)                                                    
InteroperabilityInde|R98                                                       
InteroperabilityVers|(null)                                                    
--------------------+----------------------------------------------------------
EXIF data contains a thumbnail (3442 bytes).
EXIF tags in 'dsc00305.jpg' ('Intel' byte order):
--------------------+----------------------------------------------------------
Tag                 |Value                                                     
--------------------+----------------------------------------------------------
Bildbeschreibung    |                                                          
Hersteller          |SONY                                                      
Modell              |DSC-W1                                                    
Orientierung        |oben - links                                              
Auflösung in x-Richt|72,00                                                     
Auflösung in y-Richt|72,00                                                     
Maßeinheit der Auflö|Inch                                                      
Datum und Uhrzeit   |2005:02:11 13:01:12                                       
YCbCr Positionierung|co-sited                                                  
Kompression         |JPEG Kompression                                          
Hersteller          |SONY                                                      
Modell              |DSC-W1                                                    
Orientierung        |oben - links                                              
Auflösung in x-Richt|72,00                                                     
Auflösung in y-Richt|72,00                                                     
Maßeinheit der Auflö|Inch                                                      
Datum und Uhrzeit   |2005:02:11 13:01:12                                       
Belichtungszeit     |1/30 sec.                                                 
FNumber             |f/2,8                                                     
ExposureProgram     |Normalprogramm                                            
ISO Speed Ratings   |200                                                       
Exif Version        |Exif Version 2.2                                          
Datum und Uhrzeit (o|2005:02:11 13:01:12                                       
Datum und Uhrzeit (d|2005:02:11 13:01:12                                       
ComponentsConfigurat|Y Cb Cr -                                                 
Compressed Bits per |8,00                                                      
Exposure Bias       |0,0                                                       
MaxApertureValue    |3,00                                                      
Metering Mode       |Pattern                                                   
Lichtquelle         |0                                                         
Blitz               |Flash did not fire, auto mode.                            
Focal Length        |7,9 mm                                                    
Anmerkungen des Hers|1566 Byte(s) unbekannte Daten                             
FlashPixVersion     |FlashPix Version 1.0                                      
Color Space         |sRGB                                                      
PixelXDimension     |2592                                                      
PixelYDimension     |1944                                                      
Dateiquelle         |DSC                                                       
Scene Type          |(null)                                                    
Custom Rendered     |Normal process                                            
Belichtungsart      |Automatische Belichtungzeit                               
White Balance       |Auto white balance                                        
Scene Capture Type  |Standard                                                  
Kontrast            |Normal                                                    
Sättigung           |Normal                                                    
Schärfe             |Normal                                                    
InteroperabilityInde|R98                                                       
InteroperabilityVers|(null)                                                    
--------------------+----------------------------------------------------------
EXIF data contains a thumbnail (9009 bytes).

Antworten