Added "exif" keyword argument to save Image.Exif instance

This commit is contained in:
Andrew Murray 2021-07-04 12:33:55 +10:00
parent 94ecb27903
commit c0f619384c
3 changed files with 34 additions and 6 deletions

View File

@ -403,10 +403,8 @@ class TestFileTiff:
with Image.open("Tests/images/ifd_tag_type.tiff") as im:
assert 0x8825 in im.tag_v2
def test_exif(self):
with Image.open("Tests/images/ifd_tag_type.tiff") as im:
exif = im.getexif()
def test_exif(self, tmp_path):
def check_exif(exif):
assert sorted(exif.keys()) == [
256,
257,
@ -439,6 +437,17 @@ class TestFileTiff:
assert gps[0] == b"\x03\x02\x00\x00"
assert gps[18] == "WGS-84"
outfile = str(tmp_path / "temp.tif")
with Image.open("Tests/images/ifd_tag_type.tiff") as im:
exif = im.getexif()
check_exif(exif)
im.save(outfile, exif=exif)
with Image.open(outfile) as im:
exif = im.getexif()
check_exif(exif)
def test_exif_frames(self):
# Test that EXIF data can change across frames
with Image.open("Tests/images/g4-multi.tiff") as im:

View File

@ -898,6 +898,11 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum
require a matching type in
:py:attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype` tagtype.
**exif**
Alternate keyword to "tiffinfo", for consistency with other formats.
.. versionadded:: 8.4.0
**compression**
A string containing the desired compression method for the
file. (valid only with libtiff installed) Valid compression

View File

@ -1142,6 +1142,17 @@ class TiffImageFile(ImageFile.ImageFile):
if not self.is_animated:
self._close_exclusive_fp_after_loading = True
# reset buffered io handle in case fp
# was passed to libtiff, invalidating the buffer
self.fp.tell()
# load IFD data from fp before it is closed
exif = self.getexif()
for key in TiffTags.TAGS_V2_GROUPS.keys():
if key not in exif:
continue
exif.get_ifd(key)
def _load_libtiff(self):
"""Overload method triggered when we detect a compressed tiff
Calls out to libtiff"""
@ -1504,12 +1515,15 @@ def _save(im, fp, filename):
ifd[IMAGELENGTH] = im.size[1]
# write any arbitrary tags passed in as an ImageFileDirectory
info = im.encoderinfo.get("tiffinfo", {})
info = im.encoderinfo.get("tiffinfo", im.encoderinfo.get("exif", {}))
logger.debug("Tiffinfo Keys: %s" % list(info))
if isinstance(info, ImageFileDirectory_v1):
info = info.to_v2()
for key in info:
ifd[key] = info.get(key)
if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS.keys():
ifd[key] = info.get_ifd(key)
else:
ifd[key] = info.get(key)
try:
ifd.tagtype[key] = info.tagtype[key]
except Exception: