2017-12-30 6 views
0

Ich brauche einen String zu erhalten, die von Informationen von Bild EXIF ​​besteht, zum Beispiel:Script für die Formatierung Bild EXIF-Ausgabe von ImageMagick

Camera, Brennweite in 35mm Format: 24mm, F11, 1/500, 200 ISO

konnte ich sehen, die alle vorhandenen Informationen aus

identify -format '%[EXIF:*]' image.jpg

aber ich habe Probleme Konsolidierung der Ausgabe und Generierung der Informationen.

Das erste Problem, während '% [EXIF: *]' alle EXIF-Daten druckt, wenn ich den Stern mit einem bestimmten EXIF-Tag ersetzen, es nichts ausdruckt. Ich weiß, ich könnte einfach alle EXIF-Daten ein paar Mal ausdrucken und grep verwenden, um die eine zu bekommen, die ich brauche, dann kombiniere ich sie zusammen, aber es fühlt sich besser an, nur den Wert wiederzufinden, nach dem ich suche.

Das zweite Problem, der Blendenwert FNumber ist in einem Format wie "63/10", aber ich brauche es 6,3; Nervig, die Verschlusszeit ExposureTime ist wie 10/5000, ich brauche es 1/500. Welche Art von Konvertierung benötige ich für jeden Fall?

Danke!

+0

Sie sagen nicht, welche Version von IM Sie verwenden; Sie zeigen nicht den Code, den Sie versucht haben, die exakten EXIF-Daten zu erhalten. Sie sagen auch nicht, welche Programmiersprache oder welches Betriebssystem Sie verwenden. Diese können sich alle darauf auswirken, welche Antwort Sie benötigen. – Bonzo

Antwort

0

Dies funktioniert für mich in ImageMagick 6.9.9.29 Q16 Mac OSX.

infile="P1050001.JPG" 
cameramodel=`identify -ping -format "%[EXIF:model]" "$infile"` 
focallenght35=`identify -ping -format "%[EXIF:FocalLengthIn35mmFilm]" "$infile"` 
fnumber1=`identify -ping -format "%[EXIF:FNumber]" "$infile" | cut -d/ -f1` 
fnumber2=`identify -ping -format "%[EXIF:FNumber]" "$infile" | cut -d/ -f2` 
exptime1=`identify -ping -format "%[EXIF:ExposureTime]" "$infile" | cut -d/ -f1` 
exptime2=`identify -ping -format "%[EXIF:ExposureTime]" "$infile" | cut -d/ -f2` 
isospeed=`identify -ping -format "%[EXIF:ISOSpeedRatings]" "$infile"` 
fnumber=`echo "scale=1; $fnumber1/$fnumber2" | bc` 
exptime=`echo "scale=3; $exptime1/$exptime2" | bc` 
echo "CameraModel=$cameramodel, FocalLengthIn35mmFilm: $focallenght35 mm, F$fnumber, $exptime sec, ISO $isospeed" 


Camera = DMC-FZ30, FocalLengthIn35mmFilm: 35 mm, F2.8, .125 sec, ISO 200

oder alternativ

infile="P1050001.JPG" 
declare `convert -ping "$infile" -format "cameramodel=%[EXIF:model]\n focallenght35=%[EXIF:FocalLengthIn35mmFilm]\n fnumber=%[EXIF:FNumber]\n exptime=%[EXIF:ExposureTime]\n isospeed=%[EXIF:ISOSpeedRatings]\n" info:` 
fnumber1=`echo $fnumber | cut -d/ -f1` 
fnumber2=`echo $fnumber | cut -d/ -f2` 
fnumber=`echo "scale=1; $fnumber1/$fnumber2" | bc` 
exptime1=`echo $exptime | cut -d/ -f1` 
exptime2=`echo $exptime | cut -d/ -f2` 
exptime=`echo "scale=0; $exptime2/$exptime1" | bc` 
echo "CameraModel=$cameramodel, FocalLengthIn35mmFilm: $focallenght35 mm, F$fnumber, 1/$exptime sec, ISO $isospeed" 


Camera = DMC- FZ30, FocalLengthIn35mmFilm: 35 mm, F2,8, 1/8 Sek., ISO 200

+0

Dies ist fast perfekt, gibt es einen Weg zu haben, sagen wir, die Ausgabe der Brennweite ist '10/5000' und ich will es' 1/500' anstelle von 0,002? – hzxu

+0

Ich habe die Einteilung der Belichtungszeit in meinem zweiten Beispiel bereits als 1/8 sec. Gezeigt. – fmw42

1

Hier ist etwas, um mit awk anzufangen, nach den EXIF-Schlüsselwörtern zu suchen und die entsprechende Einstellung zu speichern, wie sie vorbei gehen. Dann am END es druckt er gefunden:

#!/bin/bash 

identify -format '%[EXIF:*]' a.jpg | awk -F= ' 
    /^exif:Model/     {model=$2} 
    /^exif:FocalLengthIn35mmFilm/ {focal=$2} 
    /^exif:FNumber/    {f=$2} 
    /^exif:ExposureTime/   {t=$2} 
    /^exif:ISOSpeedRatings/  {ISO=$2} 
    END { 
     # Check if fNumber is a rational number and refactor if it is 
     n=split(f,k,"/") 
     if(n==2){ 
     f=sprintf("%.1f",k[1]/k[2]); 
     } 
     # Check if exposure time is a rational number and refactor if it is 
     n=split(t,k,"/") 
     if(n==2){ 
     m=int(k[2]/k[1]); 
     t=sprintf("1/%d",m); 
     } 
     print model,focal,f,t,ISO 
    }' OFS=, 

Beispielausgabe

iPhone 4,35,2.8,1/914,80 

Ich habe nicht die Umwandlung von rationalen Zahlen zu ausgiebig getestet ... zwischen dem festlich Whisky ...

+0

Danke für die Antwort, es funktioniert, obwohl es möglicherweise ein Problem gibt, wenn die Belichtungszeit mehr als eine Sekunde ist und die "1 /% d" könnte vermasselt werden. – hzxu

1

Noch einfacher ist es, EXIFTOOL direkt zu verwenden .

infile="P1050001.JPG" 
exiftool -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" 

Camera Model Name    : DMC-FZ30 
Focal Length In 35mm Format  : 35 mm 
F Number      : 2.8 
Exposure Time     : 1/8 
ISO        : 200 

oder

infile="P1050001.JPG" 
exiftool -csv -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" 

P1050001.JPG,DMC-FZ30,35 mm,2.8,1/8,200 
+0

Das ist auch in Ordnung, aber ich bemerkte den Parameter '-csv', wie lösche ich das Komma und ersetze sie durch Leerzeichen? – hzxu

1

jzxu wrote: Das ist auch in Ordnung, jedoch bemerkte ich den Parameter -csv, wie kann ich von dem Komma loswerden und ersetzen Sie sie durch Leerzeichen?

Ein Weg, auf Unix ist einfach tr verwenden Sie den Befehl mit einem Leerzeichen zu ersetzen, wie folgt:

exiftool -csv -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" | tr "," " " 

SourceFile Model FocalLengthIn35mmFormat FNumber ExposureTime ISO 
P1050001.JPG DMC-FZ30 35 mm 2.8 1/8 200 


Oder wenn Sie nicht wollen, die Kopfzeile:

exiftool -csv -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" | tail -n +2 | tr "," " " 

P1050001.JPG DMC-FZ30 35 mm 2.8 1/8 200 


Möglicherweise gibt es andere interne EXIFTOOL-Formatierungsoptionen. Siehe https://sno.phy.queensu.ca/~phil/exiftool/exiftool_pod.html

Ich bin kein Experte für EXIFTOOL, also vielleicht habe ich etwas verpasst. Ich sehe jedoch kein durch Leerzeichen getrenntes Ausgabeformat. Dies führt jedoch dazu, dass die Ausgabe im tabulatorgetrennten Format erfolgt.

infile="P1050001.JPG" 
exiftool -s3 -T -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" 

DMC-FZ30 35 mm 2.8 1/8 200 


So könnte man tr verwenden Tabs mit Leerzeichen zu ersetzen.

exiftool -s3 -T -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" | tr "\t" " " 

DMC-FZ30 35 mm 2.8 1/8 200 
Verwandte Themen