mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-25 01:16:16 +03:00
Merge pull request #8286 from radarhere/xmp
This commit is contained in:
commit
95c867dabf
|
@ -991,6 +991,21 @@ class TestFileJpeg:
|
||||||
else:
|
else:
|
||||||
assert im.getxmp() == {"xmpmeta": None}
|
assert im.getxmp() == {"xmpmeta": None}
|
||||||
|
|
||||||
|
def test_save_xmp(self, tmp_path: Path) -> None:
|
||||||
|
f = str(tmp_path / "temp.jpg")
|
||||||
|
im = hopper()
|
||||||
|
im.save(f, xmp=b"XMP test")
|
||||||
|
with Image.open(f) as reloaded:
|
||||||
|
assert reloaded.info["xmp"] == b"XMP test"
|
||||||
|
|
||||||
|
im.info["xmp"] = b"1" * 65504
|
||||||
|
im.save(f)
|
||||||
|
with Image.open(f) as reloaded:
|
||||||
|
assert reloaded.info["xmp"] == b"1" * 65504
|
||||||
|
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
im.save(f, xmp=b"1" * 65505)
|
||||||
|
|
||||||
@pytest.mark.timeout(timeout=1)
|
@pytest.mark.timeout(timeout=1)
|
||||||
def test_eof(self) -> None:
|
def test_eof(self) -> None:
|
||||||
# Even though this decoder never says that it is finished
|
# Even though this decoder never says that it is finished
|
||||||
|
|
|
@ -747,17 +747,27 @@ 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"))
|
||||||
|
if xmp:
|
||||||
|
overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00"
|
||||||
|
max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len
|
||||||
|
if len(xmp) > max_data_bytes_in_marker:
|
||||||
|
msg = "XMP data is too long"
|
||||||
|
raise ValueError(msg)
|
||||||
|
size = o16(2 + overhead_len + len(xmp))
|
||||||
|
extra += b"\xFF\xE1" + size + b"http://ns.adobe.com/xap/1.0/\x00" + xmp
|
||||||
|
|
||||||
icc_profile = info.get("icc_profile")
|
icc_profile = info.get("icc_profile")
|
||||||
if icc_profile:
|
if icc_profile:
|
||||||
ICC_OVERHEAD_LEN = 14
|
overhead_len = 14 # b"ICC_PROFILE\0" + o8(i) + o8(len(markers))
|
||||||
MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN
|
max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len
|
||||||
markers = []
|
markers = []
|
||||||
while icc_profile:
|
while icc_profile:
|
||||||
markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER])
|
markers.append(icc_profile[:max_data_bytes_in_marker])
|
||||||
icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:]
|
icc_profile = icc_profile[max_data_bytes_in_marker:]
|
||||||
i = 1
|
i = 1
|
||||||
for marker in markers:
|
for marker in markers:
|
||||||
size = o16(2 + ICC_OVERHEAD_LEN + len(marker))
|
size = o16(2 + overhead_len + len(marker))
|
||||||
extra += (
|
extra += (
|
||||||
b"\xFF\xE2"
|
b"\xFF\xE2"
|
||||||
+ size
|
+ size
|
||||||
|
|
Loading…
Reference in New Issue
Block a user