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)
感谢您提供任何帮助!
看来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)