Metadaten und Archäologie: Von Funden, Photos und QR Codes – Teil 2
In diesem zweiten Teil dreht sich alles ums Automatisieren. Es geht es darum unseren Photos automatisch Metadaten hinzu zu fügen. Ich nutze derzeit darktable um meine Kamera vom Computer aus fern zu steuern, digikam um meine Photos zu verwalten, und zwei kleine Bash Skripte, die dafür sorgen, dass die QR Codes ausgelesen und in die Metadaten des Photos geschrieben werden. Die Software, die dafür benötigt wird lässt sich bei Ubuntu aus den Paketquellen installieren. Wir benötigen:
- imagemagick
- csvtool
- qrencode
- zbar
- exiftool
- inotifywait
- latex
Da es nicht möglich die Metadaten direkt während des Photographierens zu schreiben, so wie das beispielsweise mit GPS Daten funktioniert, habe ich mich dazu entschieden die nächstbeste Variante zu nehmen: Die Metadaten werden geschrieben, wenn das Photo im Dateisystem erscheint. Wenn man das nicht möchte, kann man die Daten auch per Stapelverarbeitung auf Verzeichnisebene durchführen lassen, und die Daten nachträglich einlesen lassen. Um die QR Codes zu erzeugen kommt ebenfalls ein Skript zur Anwendung, welches die Metadaten aus einer CSV Datei liest. Ergebnis ist ein PDF Dokument mit ausdrukbaren Etiketten.
Automatisiertes Erstellen von QR Codes: qrcodes.sh
Die Basisidee des Skripts stammt von hier. Das Skript liest eine CSV Datei ein. Die CSV Datei hat vier Spalten mit den Überschriften: Fundplatz, Fund Nr., Befund Nr. und Material, wobei diese Überschriften beliebig gewählt werden können. Die generierten QR Codes werden samt Beschreibung mit Latex in ein PDF Dokument gesetzt. Hierzu wird das Labels Paket genutzt.
#!/bin/bash #qrcode.sh v0.4 #25.10.2014 #B. Asmus # #Dieses Skript erstellt Qr Codes aus einer CSV Datei, #wobei die ersten 4 Spalten genutzt werden: #Funplatz, Fundnr, Befundnr, Material # #Es wird eine maschinenlesbare Variable erstellt ($qr), #die zur Erstellung des QR Codes dient. #Es wird eine weitere Variable erstellt, die für den Menschen #lesbar ist ($des). #Die erzeugte png Datei wird mittels LaTex (package: labels) #mehrspaltig gesetzt. #Das Grundkonzept wurde von hier übernommen: #http://forum.ubuntuusers.de/topic/viele-bilder-auf-jeweils-einer-dina4-seite-ano/ # daten=$1 latex="" fch=`csvtool sub 1 1 1 1 $daten` #fch, first column heading, usually "Site" echo "fch: "$fch if [ -z "$fch"]; then fch1=$fch else fch1="$fch: " fi fid=`csvtool sub 1 2 1 1 $daten | sed -e 's/ /\-/g'` #fid First ID, the more important ID, Find id if [ -z "$fid"]; then fid1=$fid else fid1="$fid: " fi sid=`csvtool sub 1 3 1 1 $daten| sed -e 's/ /\-/g'` #sid secondary ID, some redundancy is good, e.g. Feature No... if [ -z "$sid"]; then sid1=$sid else sid1="$sid: " fi mat=`csvtool sub 1 4 1 1 $daten| sed -e 's/ /\-/g'` #mat, material, description, etc.. if [ -z "$mat"]; then mat1=$mat else mat1="$mat: " fi for i in $(seq 1 `wc -l $daten | cut -d" " -f1`) #lese die Daten aus der Csv Datei ein do qr=`csvtool sub $i 1 1 1 $daten | sed -e 's/ /\_/g'`" $fid "`csvtool sub $i 2 1 1 $daten`" $sid "`csvtool sub $i 3 1 1 $daten |sed -e 's/ /\_/g'`" Material "`csvtool sub $i 4 1 1 $daten | sed -e 's/Schlacke/slag/g' -e 's/Erz/ore/g' -e 's/Gangart/gangue/g'` des="$fch1"`csvtool sub $i 1 1 1 $daten`", $fid1"`csvtool sub $i 2 1 1 $daten`", $sid1"`csvtool sub $i 3 1 1 $daten`", $mat1"`csvtool sub $i 4 1 1 $daten` qrencode "$qr" --size=16 -o qr.png convert -background white -pointsize 100 -fill black -size 1560 -gravity West caption:"$des" des.png montage -geometry +0+0 -density 300x300 -units PixelsPerInch qr.png des.png pic${i}.png latex=$latex"\\includegraphics[height=1.4cm]{pic${i}.png} " rm qr.png des.png done # PDF erstellen echo "\\documentclass{article} \\usepackage{labels} \\usepackage{graphicx} \\begin{document} \\LabelCols=3 % Number of columns of labels per page \\LabelRows=10 % Number of rows of labels per page \\LeftBorder=8mm % Space added to left border of each label \\RightBorder=8mm % Space added to right border of each label \\TopBorder=9mm % Space to leave at top of sheet \\BottomBorder=2mm % Space to leave at bottom of sheet \\LabelSetup% \\begin{labels} $latex \\end{labels} \\end{document}" > Qr-Code-labels.tex pdflatex Qr-Code-labels.tex rm Qr-Code-labels.aux rm Qr-Code-labels.log exit
Die Teile die zur Erstellung des QR Codes benutzt werden, habe ich bereits im ersten Teil hinreichend beschrieben. Der PDF Teil ist einfach: Ein echo Befehl wird in eine Textdatei umgeleitet: QR-Code-labels.tex. Diese wird mittels pdflatex gesetzt. Danach werden die Protokoll- und Hilfsdateien gelöscht. Man hat die Möglichkeit das Layout zu verändern.
Die Größe des ausgedruckten Qr Codes lässt sich in dieser Zeile verändern:
latex=$latex"\\includegraphics[height=1.4cm]{pic${i}.png} "
Wenn man diese Zeile abändert kann man ein mehrspaltiges Dokument erzeugen.
\\LabelCols=3 % Number of columns of labels per page
Wenn man diese Zeile ändert lassen sich die Anzahl der Reihen verändern:
\\LabelRows=10 % Number of rows of labels per page
Weitere Änderungen lassen sich analog zu den obigen durchführen.
Die so erzeugte PDF Datei hat beispielsweise folgendes Aussehen:
Diese Etiketten müssen ausgeschnitten und den Fundstücken beim Photographieren beigelegt werden. Mit dem nächsten Skript lesen wir dann die Information aus dem QR Code aus und schreiben diese in die Metadaten der Photos.
Schreiben der Metadaten: add_meta_data_from_qrcode.sh
Die Metadaten die in den Photos vorliegen, werden mit Hilfe dieses Skripts in die Photos geschrieben. Hierzu überwacht das kleine Programm inotiy das Dateisystem. Nachdem eine Datei in einem überwachten Verzeichnis udn Unterverzeichnis aufgetaucht ist, wird das Kommando zu Auslesen des QR Codes aufgerufen.. Die ausgelesenen Daten werden formatiert und mit Hilfe von exiftool in die Photos geschrieben.
#!/bin/bash #add_meta_data_from_qrcode.sh v0.2 # #Bastian Asmus 25. Oktober 2014 #Inotify wartet auf eine Datei die irgendwo unterhalb des #darktable Verzeichnisses erscheint, liest den QR code #aus und schreibt die Daten in den xmp-lr namespace #als hierarchical subject, denn dieses kann von digikam #unter Metadaten erneut eingelesen und direkt in 'Meine #Stichwörter' übernommen werden. #Konventionen: CSV Spalte1: Fundplatz, Spalte 2: Fund Nr, #Spalte 3: Befundnr (o.ä.), Spalte 4: Material inotifywait -m -r /Pfad/zu/Photos/von/darktable/ -e create | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" if [[ $file = *.jpg ]] then wait # decode and escape space and insert space after commas tags=(`zbarimg --raw $path$file | sed -e 's/,/\\ /g'`) exiftool -xmp-lr:HierarchicalSubject="${tags[0]/_/ }" -xmp-lr:HierarchicalSubject="${tags[0]/_/ }/${tags[1]} ${tags[2]}" -xmp-lr:HierarchicalSubject="${tags[5]}/${tags[6]}" -xmp-lr:HierarchicalSubject="${tags[5]}" -xmp-microsoft:LastKeywordXMP="${tags[*]}" -xmp:subject="${tags[*]}" \-xmp:creator="Dr. Bastian Asmus" $path$file echo "Dies ist der QR code der decodiert wurde: "$tags fi done
Zur Anwendung muss das Skript add_meta_data_from_qrcode.sh im Terminal aufgerufen und ausgeführt werden. Dann startet inotify die Überwachung des Verzeichnisses, in dem die Photos auftauchen. Das Skript schriebt die Metadaten asl hierarchical subject in den lightroom namespace. Es kann auch jeder andere namespace adressiert werden. Der lr-namespace hat sich aber für digikam als nützlich erweisen. Man kann damit aif ganz leichte Weise die Metadaten in digikams Datenbak einlesen (Bild -> Metadaten aus dem Bild neu einlesen). Auf diese Weise stehen diese dann als Schlüsselwörter zur Verfügung.
Dies ist nur eine einfache Anwendung, die sich mit der Bash und freien Werkzeugen erreichen lassen. Für die Dokumentation vieler Funde hat sich dieses System bereits sehr bewährt. Ich habe nun mehr Zeit für andere Dinge (:
Wenn euch gefallen hat, was ihr hier lest, könnt Ihr gerne einen Kommentar hinterlassen.
Januar 10th, 2015 at 08:09
[…] Artikel über QR Codes und Metadaten haben wir gesehen, wie man während des Photographierens Metadaten in Photos schreibt. Diesen Lösungsansatz verwenden wir hier auch, gestalten das Skript aber ein wenig robuster, so […]