Изменять данные EXIF в JPEG без изменения изображения
Я изменяю exif на jpeg, используя piexif для чтения и записи данных exif, что, кажется, работает нормально. Проблема в том, что когда я читаю и записываю JPEG, даже если я не меняю байты, он сохраняет изображение с разными пикселями и изображение, которое было прочитано. Мне нужно, чтобы это были точно такие же пиксели. Я понимаю, что это потому, что jpeg - это формат с потерями, но единственный способ найти его - сохранить его как png, а затем экспортировать как jpeg с Mac Preview, что не очень хорошо, потому что у меня есть сотни изображений,
def adjust_img(path):
img = PIL.Image.open(path)
exif_dict = piexif.load(img.info['exif'])
new_exif = adjust_exif(exif_dict)
exif_bytes = piexif.dump(new_exif)
pc = path.split('/')
stem = '/'.join(pc[:-1])
img.save('%s/_%s' % (stem,pc[-1]), "JPEG", exif=exif_bytes, quality=95, optimize=False)
Как я могу сохранить картинку и просто изменить exif?
2 ответа
https://piexif.readthedocs.io/en/latest/functions.html
exif_dict = piexif.load(path)
new_exif = adjust_exif(exif_dict)
exif_bytes = piexif.dump(new_exif)
piexif.insert(exif_bytes, path)
Exiftool, как правило, подходит. Но, возможно, вам действительно нужно редактировать EXIF в вашей собственной программе.
Попробуйте pyexiv2 по адресу https://pypi.org/project/pyexiv2/ . Он недавно поддерживается и работает хорошо. Пример:
import sys
from pyexiv2 import Image as ImgMeta
DTO_KEY = 'Exif.Photo.DateTimeOriginal'
filename = sys.argv[1]
with ImgMeta(filename) as img_meta:
exif = img_meta.read_exif()
try:
dto = exif[DTO_KEY]
except KeyError:
raise
# Convert dto to DateTime, add TimeDelta, format as string
# Here we skip all that to show we can simply modify it:
new_dto_str = dto + 'Z'
img_meta.modify_exif({DTO_KEY: new_dto_str})