Python: удаление информации Exif из изображений

Чтобы уменьшить размер изображений для использования на веб-сайте, я снизил качество до 80-85%. Это немного уменьшает размер изображения, вплоть до некоторой степени.

Чтобы еще больше уменьшить размер без ущерба для качества, мой друг отметил, что необработанные изображения с камер содержат много метаданных, называемых информацией Exif. Поскольку нет необходимости сохранять эту информацию Exif для изображений на веб-сайте, мы можем удалить ее. Это еще больше уменьшит размер на 3-10 кБ.

Но я не могу найти подходящую библиотеку для этого в моем коде Python. Я просмотрел похожие вопросы и опробовал некоторые методы:

Исходное изображение: http://mdb.ibcdn.com/8snmhp4sjd75vdr27gbadolc003i.jpg

  1. Mogrify

    /usr/local/bin/mogrify -strip filename
    

    Результат: http://s23.postimg.org/aeaw5x7ez/8snmhp4sjd75vdr27gbadolc003i_mogrify.jpg  Этот метод уменьшает размер со 105 кБ до 99,6 кБ, но также изменяет качество цвета.

  2. Exif-инструмент

    exiftool -all= filename
    

    Результат: http://s22.postimg.org/aiq99o775/8snmhp4sjd75vdr27gbadolc003i_exiftool.jpg Этот метод уменьшает размер со 105 кБ до 72,7 кБ, но также изменяет качество цвета.

  3. Этот ответ подробно объясняет, как манипулировать информацией Exif, но как мне использовать ее для удаления информации?

Может ли кто-нибудь помочь мне удалить все лишние метаданные, не меняя цвета, размеры и другие свойства изображения?

Ответ 1

Вы можете попробовать загрузить изображение с помощью Python Image Lirbary (PIL), а затем снова сохранить его в другом файле. Это должно удалить метаданные.

Ответ 2

from PIL import Image

image = Image.open('image_file.jpeg')

# next 3 lines strip exif
data = list(image.getdata())
image_without_exif = Image.new(image.mode, image.size)
image_without_exif.putdata(data)

image_without_exif.save('image_file_without_exif.jpeg')

Ответ 3

Для меня gexiv2 отлично работает:

#!/usr/bin/python3

from gi.repository import GExiv2

exif = GExiv2.Metadata('8snmhp4sjd75vdr27gbadolc003i.jpg')
exif.clear_exif()
exif.clear_xmp()
exif.save_file()

См. также Библиотека манипуляций Exif для python, которую вы связали, но не прочитали все ответы;)

Ответ 4

Вам даже не нужно делать дополнительные шаги, предлагаемые @user2141737. Кажется, достаточно просто открыть его с помощью PIL и сохранить его снова:

from PIL import Image
image = Image.open('path/to/image')
image.save('new/path/' + file_name)