Сохранять отметку времени при уменьшении изображения - PullRequest
3 голосов
/ 17 апреля 2010

Моя цифровая камера делает снимки с очень высоким разрешением, и у меня есть сценарий PIL, чтобы уменьшить их до 800x600 (или 600x800).Однако было бы неплохо, чтобы результирующий файл сохранил исходную временную метку.Я заметил в документах, что я могу использовать объект File вместо имени в методе сохранения изображения PIL, но я не знаю, поможет ли это или нет.

Мой код в основном name, 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)

Спасибо за любую помощь, которую вы можете оказать!

1 Ответ

5 голосов
/ 17 апреля 2010

Использование shutil.copystat

Похоже, что PIL не сохраняет метаданные EXIF. Для копирования данных EXIF ​​с использованием Python вы можете использовать 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')

PIL может читать данные EXIF, но пока не может записывать данные EXIF. Мы можем получить доступ к данным, используя метод _getexif():

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

Анализ временной метки может зависеть от того, какой формат использует камера. Это работает для моей камеры; YMMV. Пакет 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 и 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)))
...