2010-04-17 177 views
3

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

我的代码基本上是 名,EXT = os.path.splitext(文件名)

# 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) 

感谢您的帮助,您可以给!

回答

5

使用shutil.copystat

看来,PIL不保存EXIF元数据。 要使用Python复制EXIF数据,您可以使用 pyexiv2。例如,这是用Python编写的批量照片调整器程序Phatch如何处理EXIF数据。

我不确定您是否使用Ubuntu,但如果是这样,安装很容易,因为pyexiv2python-pyexiv2包提供。

编辑:如果你不介意失去EXIF元数据,并且只想使用EXIF日期时间戳作为调整后的图像的修改日期,那么你就可以做到这一点没有pyexiv2包,从而节省您的额外的依赖性。方法如下:

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

PIL可以读取EXIF数据,但不能写入EXIF数据。我们可以使用_getexif()方法访问数据:

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

解析时间戳可能取决于摄像机采用什么格式。这适用于我的相机;因人而异。 dateutils包允许您解析各种各样的时间戳,而无需预先指定格式,但那是另一回事。

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 

调整大小的图像,并使用os.utime修复的atime和修改时间:

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))) 
+0

我最终使用的操作系统.utime改变系统的日期的概念,但pyexiv2是非常有用的,它读取我真正想要的时间,谢谢。 – Chris 2010-04-18 18:16:22

+0

@Ckhrysze:PIL可以读取EXIF元数据;它只是不能写它。所以如果你愿意,你可以消除对'pyexiv2'的依赖。例如,看我的编辑。 – unutbu 2010-04-18 19:23:49

+0

我不知道相机带有这么多信息的照片。一旦我开始玩弄pyexiv2库,我实际上最终会用很多原始数据标记新图像,因为我也刚刚了解到很多程序都在使用它们。另一方面,能够用PIL做所有事情也会很好,现在我有选择。再次感谢! – Chris 2010-04-19 14:20:55