Skip to content

Commit cb077a1

Browse files
committed
Handle UNDEFINED XMP data
1 parent 1bf32ae commit cb077a1

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

Tests/test_file_tiff.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
ImageFile,
1515
JpegImagePlugin,
1616
TiffImagePlugin,
17+
TiffTags,
1718
UnidentifiedImageError,
1819
)
1920
from PIL.TiffImagePlugin import RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION
@@ -900,6 +901,29 @@ def test_getxmp(self) -> None:
900901
assert description[0]["format"] == "image/tiff"
901902
assert description[3]["BitsPerSample"]["Seq"]["li"] == ["8", "8", "8"]
902903

904+
def test_getxmp_undefined(self, tmp_path: Path) -> None:
905+
tmpfile = tmp_path / "temp.tif"
906+
im = Image.new("L", (1, 1))
907+
ifd = TiffImagePlugin.ImageFileDirectory_v2()
908+
ifd.tagtype[700] = TiffTags.UNDEFINED
909+
with Image.open("Tests/images/lab.tif") as im_xmp:
910+
ifd[700] = im_xmp.info["xmp"]
911+
im.save(tmpfile, tiffinfo=ifd)
912+
913+
with Image.open(tmpfile) as im_reloaded:
914+
if ElementTree is None:
915+
with pytest.warns(
916+
UserWarning,
917+
match="XMP data cannot be read without defusedxml dependency",
918+
):
919+
assert im_reloaded.getxmp() == {}
920+
else:
921+
assert "xmp" in im_reloaded.info
922+
xmp = im_reloaded.getxmp()
923+
924+
description = xmp["xmpmeta"]["RDF"]["Description"]
925+
assert description[0]["format"] == "image/tiff"
926+
903927
def test_get_photoshop_blocks(self) -> None:
904928
with Image.open("Tests/images/lab.tif") as im:
905929
assert isinstance(im, TiffImagePlugin.TiffImageFile)

src/PIL/TiffImagePlugin.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1259,7 +1259,10 @@ def _seek(self, frame: int) -> None:
12591259
self.fp.seek(self._frame_pos[frame])
12601260
self.tag_v2.load(self.fp)
12611261
if XMP in self.tag_v2:
1262-
self.info["xmp"] = self.tag_v2[XMP]
1262+
xmp = self.tag_v2[XMP]
1263+
if isinstance(xmp, tuple) and len(xmp) == 1:
1264+
xmp = xmp[0]
1265+
self.info["xmp"] = xmp
12631266
elif "xmp" in self.info:
12641267
del self.info["xmp"]
12651268
self._reload_exif()

0 commit comments

Comments
 (0)