2010-04-17 174 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