缩小图像时保留时间戳

Chr*_*ris 3 python python-imaging-library

我的数码相机以非常高的分辨率拍摄照片,我有一个PIL脚本将它们缩小到800x600(或600x800).但是,结果文件保留原始时间戳会很好.我在文档中注意到我可以在PIL的图像保存方法中使用File对象而不是名称,但我不知道这是否有帮助.

我的代码基本上是名称,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)
Run Code Online (Sandbox Code Playgroud)

感谢您提供任何帮助!

unu*_*tbu 5

使用 shutil.copystat

看来PIL不保存EXIF元数据.要使用Python复制EXIF数据,您可以使用 pyexiv2.例如,Phatch是一个用Python编写的批量照片缩放器程序,它处理EXIF数据.

我不确定你是否使用Ubuntu,但如果是这样,安装很容易,因为它pyexiv2是由python-pyexiv2包提供的.

编辑:如果您不介意丢失EXIF元数据,并且只想使用EXIF日期时间戳作为调整大小的图像的修改日期,那么您可以在没有pyexiv2包的情况下执行此操作,从而为您节省额外的依赖性.这是如何做:

import os
import time
import Image
import ExifTags   # This is provided by PIL
img=Image.open(filename,'r')
Run Code Online (Sandbox Code Playgroud)

PIL可以读取EXIF数据,但还无法写入EXIF数据.我们可以使用以下_getexif()方法访问数据:

d = dict((ExifTags.TAGS[k], v) for k, v in img._getexif().items())
print(d['DateTimeOriginal'])
Run Code Online (Sandbox Code Playgroud)

解析时间戳可能取决于相机使用的格式.这适用于我的相机; 因人而异.该dateutils软件包允许您解析各种时间戳,而无需预先指定格式,但这是另一个故事.

timestamp=time.strptime(d['DateTimeOriginal'],"%Y:%m:%d %H:%M:%S")
Run Code Online (Sandbox Code Playgroud)

这是交换宽度和高度的另一种方法:

w, h = img.size
width,height = 800,600
if h > w: width,height = height,width
Run Code Online (Sandbox Code Playgroud)

调整图像大小,并使用os.utime修复atime和mtime:

filename = filename + "-800x600.jpg"
shunken = img.resize((width, height), Image.ANTIALIAS)
shunken.save(filename)
st = os.stat(filename)
os.utime(filename,(st.st_atime,time.mktime(timestamp)))
Run Code Online (Sandbox Code Playgroud)