Skip to content

Commit f42d1c1

Browse files
authored
Merge pull request #8483 from radarhere/xmp
2 parents 510c84a + 0ca832c commit f42d1c1

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

Tests/test_file_jpeg.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,8 +1000,13 @@ def test_save_xmp(self, tmp_path: Path) -> None:
10001000
with Image.open(f) as reloaded:
10011001
assert reloaded.info["xmp"] == b"XMP test"
10021002

1003-
im.info["xmp"] = b"1" * 65504
1004-
im.save(f)
1003+
# Check that XMP is not saved from image info
1004+
reloaded.save(f)
1005+
1006+
with Image.open(f) as reloaded:
1007+
assert "xmp" not in reloaded.info
1008+
1009+
im.save(f, xmp=b"1" * 65504)
10051010
with Image.open(f) as reloaded:
10061011
assert reloaded.info["xmp"] == b"1" * 65504
10071012

Tests/test_file_mpo.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,15 @@ def test_save_all() -> None:
297297
# Test that a single frame image will not be saved as an MPO
298298
jpg = roundtrip(im, save_all=True)
299299
assert "mp" not in jpg.info
300+
301+
302+
def test_save_xmp() -> None:
303+
im = Image.new("RGB", (1, 1))
304+
im2 = Image.new("RGB", (1, 1), "#f00")
305+
im2.encoderinfo = {"xmp": b"Second frame"}
306+
im_reloaded = roundtrip(im, xmp=b"First frame", save_all=True, append_images=[im2])
307+
308+
assert im_reloaded.info["xmp"] == b"First frame"
309+
310+
im_reloaded.seek(1)
311+
assert im_reloaded.info["xmp"] == b"Second frame"

src/PIL/Image.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2556,7 +2556,7 @@ def save(
25562556
self._ensure_mutable()
25572557

25582558
save_all = params.pop("save_all", False)
2559-
self.encoderinfo = params
2559+
self.encoderinfo = {**getattr(self, "encoderinfo", {}), **params}
25602560
self.encoderconfig: tuple[Any, ...] = ()
25612561

25622562
preinit()
@@ -2603,6 +2603,11 @@ def save(
26032603
except PermissionError:
26042604
pass
26052605
raise
2606+
finally:
2607+
try:
2608+
del self.encoderinfo
2609+
except AttributeError:
2610+
pass
26062611
if open_fp:
26072612
fp.close()
26082613

src/PIL/JpegImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ def validate_qtables(
758758
extra = info.get("extra", b"")
759759

760760
MAX_BYTES_IN_MARKER = 65533
761-
xmp = info.get("xmp", im.info.get("xmp"))
761+
xmp = info.get("xmp")
762762
if xmp:
763763
overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00"
764764
max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len

0 commit comments

Comments
 (0)