mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-15 02:50:53 +03:00
Merge pull request #8483 from radarhere/xmp
This commit is contained in:
commit
f42d1c1b04
|
@ -1000,8 +1000,13 @@ class TestFileJpeg:
|
||||||
with Image.open(f) as reloaded:
|
with Image.open(f) as reloaded:
|
||||||
assert reloaded.info["xmp"] == b"XMP test"
|
assert reloaded.info["xmp"] == b"XMP test"
|
||||||
|
|
||||||
im.info["xmp"] = b"1" * 65504
|
# Check that XMP is not saved from image info
|
||||||
im.save(f)
|
reloaded.save(f)
|
||||||
|
|
||||||
|
with Image.open(f) as reloaded:
|
||||||
|
assert "xmp" not in reloaded.info
|
||||||
|
|
||||||
|
im.save(f, xmp=b"1" * 65504)
|
||||||
with Image.open(f) as reloaded:
|
with Image.open(f) as reloaded:
|
||||||
assert reloaded.info["xmp"] == b"1" * 65504
|
assert reloaded.info["xmp"] == b"1" * 65504
|
||||||
|
|
||||||
|
|
|
@ -297,3 +297,15 @@ def test_save_all() -> None:
|
||||||
# Test that a single frame image will not be saved as an MPO
|
# Test that a single frame image will not be saved as an MPO
|
||||||
jpg = roundtrip(im, save_all=True)
|
jpg = roundtrip(im, save_all=True)
|
||||||
assert "mp" not in jpg.info
|
assert "mp" not in jpg.info
|
||||||
|
|
||||||
|
|
||||||
|
def test_save_xmp() -> None:
|
||||||
|
im = Image.new("RGB", (1, 1))
|
||||||
|
im2 = Image.new("RGB", (1, 1), "#f00")
|
||||||
|
im2.encoderinfo = {"xmp": b"Second frame"}
|
||||||
|
im_reloaded = roundtrip(im, xmp=b"First frame", save_all=True, append_images=[im2])
|
||||||
|
|
||||||
|
assert im_reloaded.info["xmp"] == b"First frame"
|
||||||
|
|
||||||
|
im_reloaded.seek(1)
|
||||||
|
assert im_reloaded.info["xmp"] == b"Second frame"
|
||||||
|
|
|
@ -2556,7 +2556,7 @@ class Image:
|
||||||
self._ensure_mutable()
|
self._ensure_mutable()
|
||||||
|
|
||||||
save_all = params.pop("save_all", False)
|
save_all = params.pop("save_all", False)
|
||||||
self.encoderinfo = params
|
self.encoderinfo = {**getattr(self, "encoderinfo", {}), **params}
|
||||||
self.encoderconfig: tuple[Any, ...] = ()
|
self.encoderconfig: tuple[Any, ...] = ()
|
||||||
|
|
||||||
preinit()
|
preinit()
|
||||||
|
@ -2603,6 +2603,11 @@ class Image:
|
||||||
except PermissionError:
|
except PermissionError:
|
||||||
pass
|
pass
|
||||||
raise
|
raise
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
del self.encoderinfo
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
if open_fp:
|
if open_fp:
|
||||||
fp.close()
|
fp.close()
|
||||||
|
|
||||||
|
|
|
@ -758,7 +758,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
|
||||||
extra = info.get("extra", b"")
|
extra = info.get("extra", b"")
|
||||||
|
|
||||||
MAX_BYTES_IN_MARKER = 65533
|
MAX_BYTES_IN_MARKER = 65533
|
||||||
xmp = info.get("xmp", im.info.get("xmp"))
|
xmp = info.get("xmp")
|
||||||
if xmp:
|
if xmp:
|
||||||
overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00"
|
overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00"
|
||||||
max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len
|
max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len
|
||||||
|
|
Loading…
Reference in New Issue
Block a user