缩小图像时保留时间戳

时间:2010-04-17 01:48:06

标签: python python-imaging-library

我的数码相机以非常高的分辨率拍摄照片,我有一个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)

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:5)

使用shutil.copystat

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