Скрипт для форматирования вывода EXIF ​​изображения из Imagemagick

Мне нужно получить строку, которая состоит из информации из метаданных EXIF ​​изображения. Например, я хотел бы:

CameraModel, фокусное расстояние в 35 мм Формат: 24 мм, F11, 1/500, ISO 200

Я мог видеть всю информацию от

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

Однако у меня возникли проблемы с консолидацией выходных данных и генерацией информации.

Первая проблема, в то время как "%[EXIF:*]" печатает все данные EXIF, если я заменяю звезду определенным тегом EXIF, она ничего не печатает. Я знаю, что мог бы просто распечатать все данные EXIF ​​несколько раз и использовать grep чтобы получить тот, который мне нужен, затем объединить их вместе, но лучше получить именно то значение, которое я ищу.

Вторая проблема, значение диафрагмы FNumber находится в формате, подобном "63/10", но мне нужно, чтобы оно было 6,3; Досадно, что выдержка затвора ExposureTime равна 10/5000, и мне нужно, чтобы она была 1/500. Какое преобразование мне нужно для каждого случая?

Спасибо!

4 ответа

Решение

Это отлично работает для меня в 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"


CameraModel = DMC-FZ30, FocalLengthIn35mmFilm: 35 мм, F2,8, 0,125 с, ISO 200

Или поочередно,

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"


CameraModel = DMC-FZ30, FocalLengthIn35mmFilm: 35 мм, F2.8, 1/8 сек, ISO 200

jzxu wrote: Это тоже хорошо, однако я заметил параметр -csv, как мне избавиться от запятой и заменить их пробелами?

Один из способов в unix - просто использовать tr для замены команды пробелом следующим образом:

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


Или, если вы не хотите строку заголовка:

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

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


Могут быть и другие внутренние параметры форматирования EXIFTOOL. См. https://sno.phy.queensu.ca/~phil/exiftool/exiftool_pod.html

Я не эксперт по EXIFTOOL, так что, возможно, я что-то упустил. Но я не вижу формат вывода с разделителями-пробелами. Тем не менее, это делает вывод в формате с разделителями табуляции.

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

DMC-FZ30    35 mm   2.8 1/8 200


Таким образом, можно использовать tr для замены табуляции пробелами.

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

DMC-FZ30 35 mm 2.8 1/8 200

Вот кое-что, чтобы вы начали использовать awk искать ключевые слова EXIF ​​и сохранять соответствующие настройки, когда они проходят мимо. Тогда на END он печатает все, что нашел:

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

Пример вывода

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

Я не слишком проверял преобразование из рациональных чисел... между праздничными виски...

Еще проще использовать EXIFTOOL напрямую.

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

или же

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

P1050001.JPG,DMC-FZ30,35 mm,2.8,1/8,200
Другие вопросы по тегам