从 Imagemagick 格式化图像的 EXIF 输出的脚本
Script for formatting image's EXIF output from Imagemagick
我需要获取包含图像 EXIF 元数据信息的字符串。例如,我想:
CameraModel, Focal Length in 35mm Format: 24mm, 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。每种情况我需要什么样的转换?
谢谢!
这里有一些内容可以帮助您开始使用 awk
来查找 EXIF 关键字并在它们过去时保存相应的设置。然后在 END
它打印它找到的所有内容:
#!/bin/bash
identify -format '%[EXIF:*]' a.jpg | awk -F= '
/^exif:Model/ {model=}
/^exif:FocalLengthIn35mmFilm/ {focal=}
/^exif:FNumber/ {f=}
/^exif:ExposureTime/ {t=}
/^exif:ISOSpeedRatings/ {ISO=}
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
我没有太广泛地测试有理数的转换...在节日威士忌之间...
这对我来说在 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
更简单的是直接使用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
jzxu wrote:
This is fine, too, however, I noticed the parameter
-csv, how do I get rid of the comma and replace them with spaces?
Unix 上的一种方法是使用 tr 将命令替换为 space,如下所示:
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
或者,如果您不想要 header 行:
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 专家,所以我可能漏掉了什么。但是我没有看到 space 分隔的输出格式。但是,这会使输出采用制表符分隔格式。
infile="P1050001.JPG"
exiftool -s3 -T -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile"
DMC-FZ30 35 mm 2.8 1/8 200
因此可以使用 tr 将制表符替换为 spaces.
exiftool -s3 -T -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" | tr "\t" " "
DMC-FZ30 35 mm 2.8 1/8 200
我需要获取包含图像 EXIF 元数据信息的字符串。例如,我想:
CameraModel, Focal Length in 35mm Format: 24mm, 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。每种情况我需要什么样的转换?
谢谢!
这里有一些内容可以帮助您开始使用 awk
来查找 EXIF 关键字并在它们过去时保存相应的设置。然后在 END
它打印它找到的所有内容:
#!/bin/bash
identify -format '%[EXIF:*]' a.jpg | awk -F= '
/^exif:Model/ {model=}
/^exif:FocalLengthIn35mmFilm/ {focal=}
/^exif:FNumber/ {f=}
/^exif:ExposureTime/ {t=}
/^exif:ISOSpeedRatings/ {ISO=}
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
我没有太广泛地测试有理数的转换...在节日威士忌之间...
这对我来说在 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
更简单的是直接使用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
jzxu wrote:
This is fine, too, however, I noticed the parameter -csv, how do I get rid of the comma and replace them with spaces?
Unix 上的一种方法是使用 tr 将命令替换为 space,如下所示:
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
或者,如果您不想要 header 行:
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 专家,所以我可能漏掉了什么。但是我没有看到 space 分隔的输出格式。但是,这会使输出采用制表符分隔格式。
infile="P1050001.JPG"
exiftool -s3 -T -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile"
DMC-FZ30 35 mm 2.8 1/8 200
因此可以使用 tr 将制表符替换为 spaces.
exiftool -s3 -T -model -FocalLengthIn35mmFormat -FNumber -ExposureTime -ISO "$infile" | tr "\t" " "
DMC-FZ30 35 mm 2.8 1/8 200