在不改变图片的情况下修改JPEG文件的EXIF数据

15

我使用Piexif读取和写入JPEG的EXIF数据,并更改了它的EXIF,这似乎效果很好。但问题在于当我读取和写入JPEG时,即使我不更改字节,它也会以不同的像素保存图片和读取的图片。我需要它完全相同的像素。我知道这是因为JPEG是一种有损格式,但我找到的唯一解决方法是将其保存为PNG,然后使用Mac预览导出为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)

如何保留图片并仅更改exif信息?

1
使用 exiftool。通过 homebrew 安装,命令为 brew install exiftool - Mark Setchell
1
最终使用了这个。谢谢! - syzygy
2个回答

21

4
如果你搜索到这里,使用这个库之前要小心。它已经多年没有更新了,并且有很多未解决的问题。我不会相信它可以在没有大量测试的情况下修改用户文件。 - Glenn Maynard

8

通常情况下,Exiftool 是最好的选择。但是假设你真的需要在自己的程序中编辑 EXIFs?

尝试一下 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})

我通常会在备份副本上进行编辑,然后如果满意,再将其放入位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接