Изменение размера изображения на Python без потери данных EXIF

Мне нужно изменить размер jpg-изображений с помощью Python, не теряя исходные данные EXIF ​​(метаданные о дате, модели камеры и т. Д.). Все поисковые запросы Google в отношении python и изображений указывают на библиотеку PIL, которую я сейчас использую, но, похоже, не могут сохранить метаданные. Код, который у меня есть до сих пор (с использованием PIL), таков:

img = Image.open('foo.jpg') width,height = 800,600 if img.size[0] < img.size[1]: width,height = height,width resized_img = img.resize((width, height), Image.ANTIALIAS) # best down-sizing filter resized_img.save('foo-resized.jpg') 

Есть идеи? Или другие библиотеки, которые я мог бы использовать?

9 Solutions collect form web for “Изменение размера изображения на Python без потери данных EXIF”

 import jpeg jpeg.setExif(jpeg.getExif('foo.jpg'), 'foo-resized.jpg') 

http://www.emilas.com/jpeg/

Вы можете использовать pyexiv2 для копирования EXIF-данных из исходного изображения. В следующем примере изображение изменяется с использованием библиотеки PIL, данные EXIF, скопированные с pyexiv2, и поля EXIF ​​размера изображения устанавливаются с новым размером.

 def resize_image(source_path, dest_path, size): # resize image image = Image.open(source_path) image.thumbnail(size, Image.ANTIALIAS) image.save(dest_path, "JPEG") # copy EXIF data source_image = pyexiv2.Image(source_path) source_image.readMetadata() dest_image = pyexiv2.Image(dest_path) dest_image.readMetadata() source_image.copyMetadataTo(dest_image) # set EXIF image size info to resized size dest_image["Exif.Photo.PixelXDimension"] = image.size[0] dest_image["Exif.Photo.PixelYDimension"] = image.size[1] dest_image.writeMetadata() # resizing local file resize_image("41965749.jpg", "resized.jpg", (600,400)) 

На самом деле существует действительно простой способ копирования данных EXIF ​​с картинки на другой только с PIL. Хотя он не позволяет изменять теги exif.

 image = Image.open('test.jpg') exif = image.info['exif'] # Your picture process here image = image.rotate(90) image.save('test_rotated.jpg', 'JPEG', exif=exif) 

Как вы можете видеть, функция сохранения может принимать аргумент exif, который позволяет копировать необработанные данные exif в новом изображении при сохранении. Вам действительно не нужна никакая другая библиотека, если это все, что вы хотите сделать. Я не могу найти какую-либо документацию по параметрам сохранения, и я даже не знаю, характерно это для подушки или для работы с PIL. (Если у кого-то есть какая-то ссылка, мне бы понравилось, если бы они разместили ее в комментариях)

Почему бы не использовать ImageMagick ?
Это довольно стандартный инструмент (например, это стандартный инструмент, используемый в Gallery 2); Я никогда не использовал его, однако он также имеет интерфейс python (или вы также можете просто вызвать команду), и, прежде всего, должен поддерживать информацию EXIF ​​между всеми преобразованиями.

Вы можете использовать pyexiv2 для изменения файла после его сохранения.

Для pyexiv2 v0.3.2 документация API относится к методу копирования для переноса EXIF-данных с одного изображения на другое. В этом случае это будет EXIF-данные исходного изображения для измененного изображения.

Отправляясь @Maksym Kozlenko, обновленный код для копирования EXIF-данных:

  source_image = pyexiv2.ImageMetadata(source_path) source_image.read() dest_image = pyexiv2.ImageMetadata(dest_path) dest_image.read() source_image.copy(dest_image,exif=True) dest_image.write() 

PIL обрабатывает данные EXIF, не так ли? Посмотрите в PIL.ExifTags.

 from PIL import Image img_path = "/tmp/img.jpg" img = Image.open(img_path) exif = img.info['exif'] img.save("output_"+img_path, exif=exif) 

Протестировано в подушке 2.5.3

Кажется, решение @ Depado не работает для меня, в моем сценарии изображение даже не содержит сегмент exif.

pyexiv2 сложно установить на моем Mac, вместо этого я использую модуль pexif https://github.com/bennoleslie/pexif/blob/master/pexif.py . Чтобы «добавить сегмент exif» к изображению не содержит exif-информации, я добавил информацию exif, содержащуюся в изображении, которому принадлежит сегмент exif

 from pexif import JpegFile #get exif segment from an image jpeg = JpegFile.fromFile(path_with_exif) jpeg_exif = jpeg.get_exif() #import the exif segment above to the image file which does not contain exif segment jpeg = JpegFile.fromFile(path_without_exif) exif = jpeg.import_exif(jpeg_exif) jpeg.writeFile(path_without_exif) 
  • как правильно установить модули в Pycharm?
  • Вырезание одного изображения на несколько изображений с использованием библиотеки изображений Python
  • эффективно преобразовать строку (или кортеж) в массив ctypes
  • Отменить в Gui для изображений
  • Как извлечь данный фрейм из анимации .gif в Python
  • Как уменьшить размер файла изображения с помощью PIL
  • numpy.array файла изображения «I; 16»
  • Чтение исходных изображений с помощью PIL и Python
  •  
    Interesting Posts for Van-Lav

    Демонтаж сельдерея

    OOP python – удаление экземпляра класса из списка

    Python urllib и urllib2 не открывают URL-адреса localhost?

    Как я могу получить доступ к переменной класса в инициализаторе в Python?

    как round_corner логотип без белого фона (прозрачный?) на нем с помощью pil?

    Как печатать как printf в python3?

    Как суммировать и означать один DataFrame для создания другого DataFrame

    Объединить отсортированные списки в python

    python: мои классы как ключи dict. как?

    Как разобрать этот огромный XML-файл с вложенными элементами, используя lxml, эффективным способом?

    Включение потоков импорта / экспорта между удаленной базой данных postgres и excel workbooks

    Как найти и заменить n-е появление слова в предложении, используя регулярное выражение python?

    Ничего не происходит, когда я делаю: команда python manage.py

    numpy.isnan (значение) не совпадает с значением == numpy.nan?

    Scrapy: улавливать ответы с помощью определенных кодов HTTP-сервера

    Python - лучший язык программирования в мире.