我的数码相机以非常高的分辨率拍摄照片,我有一个PIL脚本将它们缩小到800x600(或600x800)。但是,结果文件保留原始时间戳会很好。我在文档中注意到我可以在PIL的图像保存方法中使用File对象而不是名称,但我不知道这是否有帮助。
我的代码基本上是 name,ext = os.path.splitext(filename)
# open an image file (.bmp,.jpg,.png,.gif) you have in the working folder
image = Image.open(filename)
width = 800
height = 600
w, h = image.size
if h > w:
width = 600
height = 800
name = name + ".jpg"
shunken = image.resize((width, height), Image.ANTIALIAS)
shunken.save(name)
感谢您提供任何帮助!
答案 0 :(得分:5)
PIL似乎不保存EXIF元数据。 要使用Python复制EXIF数据,您可以使用 pyexiv2。例如,Phatch是用Python编写的批量照片缩放器程序处理EXIF数据的方式。
我不确定您是否使用Ubuntu,但如果是这样,安装很容易,因为pyexiv2
包提供python-pyexiv2
。
编辑:如果您不介意丢失EXIF元数据,并且只想使用EXIF日期时间戳作为调整大小后图像的修改日期,那么您可以在不使用{{1包,从而为您节省额外的依赖。方法如下:
pyexiv2
PIL可以读取EXIF数据,但还无法写入EXIF数据。我们可以使用import os
import time
import Image
import ExifTags # This is provided by PIL
img=Image.open(filename,'r')
方法访问数据:
_getexif()
解析时间戳可能取决于相机使用的格式。这适用于我的相机;因人而异。 dateutils
包允许您解析各种时间戳,而无需预先指定格式,但这是另一个故事。
d = dict((ExifTags.TAGS[k], v) for k, v in img._getexif().items())
print(d['DateTimeOriginal'])
这是交换宽度和高度的另一种方法:
timestamp=time.strptime(d['DateTimeOriginal'],"%Y:%m:%d %H:%M:%S")
调整图片大小,并使用w, h = img.size
width,height = 800,600
if h > w: width,height = height,width
修复atime和mtime:
os.utime