更改JPEG上的EXIF数据而不更改图片

syz*_*ygy 6 python jpeg image python-imaging-library

我使用piexif更改jpeg上的exif来读写exif数据,这似乎工作正常。问题是,当我读写jpeg时,即使不更改字节,它也会保存具有不同像素的图片和读取的图片。我需要它是完全相同的像素。我了解这是因为jpeg是有损格式,但是我发现它的唯一方法是将其保存为png,然后使用Mac Preview将其导出为jpeg,这不好,因为我有数百张图片。

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)
Run Code Online (Sandbox Code Playgroud)

如何保存图片并仅更改exif?

Gri*_*ave 9

Exiftool 通常是最佳选择。但是假设您确实需要在自己的程序中编辑 EXIF?

在https://pypi.org/project/pyexiv2/尝试 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})
Run Code Online (Sandbox Code Playgroud)

当我使用它时,我通常会在备份副本上进行编辑,然后如果满意的话将其移动到位。


hMa*_*oba 5

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)
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经在这里搜索过,请在使用此库之前小心。它已经很多年没有更新了,并且有很多未解决的问题。如果没有经过大量测试,我不相信它会修改用户文件。 (4认同)