Skip to content

Commit b261e17

Browse files
authored
Merge pull request #6335 from radarhere/exif
2 parents 8bffead + b188577 commit b261e17

File tree

5 files changed

+42
-0
lines changed

5 files changed

+42
-0
lines changed

Tests/test_file_mpo.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,15 @@ def test_parallax():
124124
assert exif.get_ifd(0x927C)[0xB211] == -3.125
125125

126126

127+
def test_reload_exif_after_seek():
128+
with Image.open("Tests/images/sugarshack.mpo") as im:
129+
exif = im.getexif()
130+
del exif[296]
131+
132+
im.seek(1)
133+
assert 296 in exif
134+
135+
127136
def test_mp():
128137
for test_file in test_files:
129138
with Image.open(test_file) as im:

Tests/test_file_tiff.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,26 @@ def check_exif(exif):
497497
exif = im.getexif()
498498
check_exif(exif)
499499

500+
def test_modify_exif(self, tmp_path):
501+
outfile = str(tmp_path / "temp.tif")
502+
with Image.open("Tests/images/ifd_tag_type.tiff") as im:
503+
exif = im.getexif()
504+
exif[256] = 100
505+
506+
im.save(outfile, exif=exif)
507+
508+
with Image.open(outfile) as im:
509+
exif = im.getexif()
510+
assert exif[256] == 100
511+
512+
def test_reload_exif_after_seek(self):
513+
with Image.open("Tests/images/multipage.tiff") as im:
514+
exif = im.getexif()
515+
del exif[256]
516+
im.seek(1)
517+
518+
assert 256 in exif
519+
500520
def test_exif_frames(self):
501521
# Test that EXIF data can change across frames
502522
with Image.open("Tests/images/g4-multi.tiff") as im:

src/PIL/Image.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,10 @@ def get_value(element):
13831383
def getexif(self):
13841384
if self._exif is None:
13851385
self._exif = Exif()
1386+
self._exif._loaded = False
1387+
elif self._exif._loaded:
1388+
return self._exif
1389+
self._exif._loaded = True
13861390

13871391
exif_info = self.info.get("exif")
13881392
if exif_info is None:
@@ -1407,6 +1411,12 @@ def getexif(self):
14071411

14081412
return self._exif
14091413

1414+
def _reload_exif(self):
1415+
if self._exif is None or not self._exif._loaded:
1416+
return
1417+
self._exif._loaded = False
1418+
self.getexif()
1419+
14101420
def getim(self):
14111421
"""
14121422
Returns a capsule that points to the internal image memory.

src/PIL/MpoImagePlugin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ def seek(self, frame):
8282
if i16(segment) == 0xFFE1: # APP1
8383
n = i16(self.fp.read(2)) - 2
8484
self.info["exif"] = ImageFile._safe_read(self.fp, n)
85+
self._reload_exif()
8586

8687
mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"]
8788
if mptype.startswith("Large Thumbnail"):
@@ -90,6 +91,7 @@ def seek(self, frame):
9091
self._size = (exif[40962], exif[40963])
9192
elif "exif" in self.info:
9293
del self.info["exif"]
94+
self._reload_exif()
9395

9496
self.tile = [("jpeg", (0, 0) + self.size, self.offset, (self.mode, ""))]
9597
self.__frame = frame

src/PIL/TiffImagePlugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,7 @@ def _seek(self, frame):
11361136
self.__frame += 1
11371137
self.fp.seek(self._frame_pos[frame])
11381138
self.tag_v2.load(self.fp)
1139+
self._reload_exif()
11391140
# fill the legacy tag/ifd entries
11401141
self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2)
11411142
self.__frame = frame

0 commit comments

Comments
 (0)