我用几位朋友相机拍摄的照片制作了一张相册。假设所有文件的 EXIF 曝光日期和时间都是正确的。但是文件名不一致(例如,我的相机从 IMG0001 开始,但我朋友的手机相机从 pic1234.jpg 开始,我自己的手机从 pic5678.jpg 开始)。
有没有办法使用 Shotwell 将每个人的文件导出到一个普通目录中,并重写文件名,以便图片按时间顺序排列?然后,当我在另一台计算机上使用另一个图像查看器(或使用 Shotwell 本身的文件浏览模式)幻灯片放映这些文件时,它们将按正确的时间顺序显示。
例子。 如果我有这六个文件……
- 我的照相机:IMG_0001.JPG- EXIF 曝光日期2012/12/25 12:05:00
- 我的照相机:IMG_0002.JPG- EXIF 曝光日期2012/12/25 12:11:00
- 我自己的电话:图片5678.jpg- EXIF 曝光日期2012/12/25 12:09:00
- 我自己的电话:图片5679.jpg- EXIF 曝光日期2012/12/25 12:15:00
- 朋友电话:图片1234.jpg- EXIF 曝光日期2012/12/25 12:08:00
- 朋友电话:图片1235.jpg- EXIF 曝光日期2012/12/25 12:18:00
...然后我想使用如下文件名导出它们:
- 20121225_120500-IMG_0001.JPG
- 20121225_120800-pic1234.jpg
- 20121225_120900-pic5678.jpg
- 20121225_121100-IMG_0002.JPG
- 20121225_121500-pic5679.jpg
- 20121225_121800-pic1235.jpg
以便在使用任何图像浏览器浏览时它们都能按正确的顺序显示。
以下脚本可以达到此目的,但并未集成到 Shotwell 中,这正是问题的关键所在,如果图片未使用 Exif 数据导出,则脚本将会(正常)失败:
#!/usr/bin/python
import pyexiv2
import sys
import shutil
def getTimestamp(f):
metadata = pyexiv2.ImageMetadata(f)
metadata.read()
try:
d = metadata['Exif.Image.DateTime']
return d.value.strftime('%Y%m%d%H%M%S')
except Exception as e:
return "00000000000000"
if len(sys.argv) > 1:
for f in sys.argv[1:]:
try:
timestamp = getTimestamp(f)
prefix = "%s_" % timestamp
if f[0:len(prefix)] == prefix:
print "File %s was already renamed, not renaming again" % (f)
else:
nn = "%s%s" % (prefix, f)
shutil.move(f, nn)
print "File %s renamed to %s" % (f, nn)
except Exception as e:
print "File %s not renamed (%s)" % (f, e)
else:
print "Usage: %s <JPG files with Exif tags>" % (sys.argv[0])
答案1
最简单的方法是将其分成两部分。
首先,将 Shotwell 中的所有图像导出到一个文件夹中。
二、使用芘尼美拉为文件提供您想要的命名模式。
以下是如何使用 pyrenamer 的示例:
这是我用来尝试匹配您问题中的示例的代码:
{imageyear}{imagemonth}{imageday}_{imagehour}{imageminute}{imagesecond}_{num3+1}.jpg
它生成的文件名如下所示:
请注意,您可以在大括号中的值之间添加字符(例如 {imageday} 和 {imagehour} 之间的下划线),以使输出更易于阅读。
最后的 {num3+1} 位是可选的,但如果您碰巧有两张照片在同一秒拍摄,它会有所帮助,并使整个画面更容易阅读。
如果你这样做,发现一个或多个设备时钟关闭,你可以使用 Shotwell 修改时间/日期,然后重新执行 pyrenamer 步骤,让一切井然有序。这对于婚礼之类的活动尤其有用,因为人们来自不同的时区,而乱序的照片看起来完全不对。
最后,不要忘记在末尾添加文件扩展名,否则它将被删除,并且可能会导致其他问题。