Подтвердить что ты не робот

Сохранять exif данные изображения с PIL при изменении размера (создать эскиз)

Когда я пытаюсь изменить размер (уменьшенное изображение) изображения с помощью PIL, данные exif теряются.

Что мне делать, чтобы сохранить exif-данные в миниатюрном изображении? Когда я искал то же самое, получил некоторые ссылки, но никто не работает.

from PIL import  Image
import StringIO

file_path = '/home/me/img/a.JPG'
im = Image.open( file_path)
THUMB_SIZES = [(512, 512)]
for thumbnail_size in THUMB_SIZES:
    im.thumbnail( thumbnail_size, Image.ANTIALIAS)
    thumbnail_buf_string = StringIO.StringIO()
    im.save('512_' + "a", "JPEG")

Оригинальное изображение имеет данные exif, но изображение im (512_a.JPEG) этого не делает.

4b9b3361

Ответ 1

import pyexiv2
from PIL import  Image

file_path = '/home/../img/a.JPG'
metadata = pyexiv2.ImageMetadata(file_path)
metadata.read()
thumb = metadata.exif_thumbnail
thumb.set_from_file(file_path)
thumb.write_to_file('512_' + "a")
thumb.erase()
metadata.write()

Теперь я открываю изображение с помощью Phatch Image Inspector, я могу видеть данные exif

Ответ 2

В моем проекте я встретил ту же проблему с вами. После поиска Google я нашел библиотеку piexif. Это помогает Pilow сохранять exif данные в миниатюры.

Вы можете использовать исходный код ниже:

from PIL import  Image
import piexif
import StringIO


file_path = '/home/me/img/a.JPG'
im = Image.open( file_path)

# load exif data
exif_dict = piexif.load(im.info["exif"])
exif_bytes = piexif.dump(exif_dict)

THUMB_SIZES = [(512, 512)]
for thumbnail_size in THUMB_SIZES:
    im.thumbnail( thumbnail_size, Image.ANTIALIAS)
    thumbnail_buf_string = StringIO.StringIO()
    # save thumbnail with exif data
    im.save('512_' + "a", "JPEG", exif=exif_bytes)

Примечание. Я использую python 3.4 и ubuntu 14.04

Ответ 3

Я прочитал часть исходного кода и нашел способ убедиться, что данные exif сохранены с миниатюрой.

Когда вы открываете файл jpg в PIL, объект Image имеет атрибут info, который является словарем. Один из ключей называется exif, и он имеет значение, которое является байтовой строкой - необработанные данные exif из изображения. Вы можете передать эту байтовую строку методу сохранения и записать данные exif в новый файл jpg:

from PIL import Image

size = (512, 512)

im = Image.open('P4072956.jpg')
im.thumbnail(size, Image.ANTIALIAS)
exif = im.info['exif']
im.save('P4072956_thumb.jpg', exif=exif)

Чтобы получить пользовательскую версию данных exif, вы можете сделать следующее:

from PIL import Image
from PIL.ExifTags import TAGS

im = Image.open('P4072956.jpg')
for k, v in im._getexif().items():
    print TAGS.get(k, k), v

Ответ 4

То, что я хочу, это изменить размер и обрезать, если необходимо все изображения из каталога, проблема в том, что я видел, как вы положили данные EXIF в конечное изображение, но когда я использую: img = ImageOps.fit(image, (480,720), Image.ANTIALIAS) Иногда при редких разрешениях изображений (всегда с вертикальной ориентацией) PIL подгоняет изображение, изменяя разрешение до 720x480