Merge pull request #8622 from radarhere/jpeg2000_comment

This commit is contained in:
Hugo van Kemenade 2024-12-28 13:05:26 +02:00 committed by GitHub
commit 41a89ea2dd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 13 additions and 6 deletions

View File

@ -424,8 +424,9 @@ def test_pclr() -> None:
def test_comment() -> None: def test_comment() -> None:
with Image.open("Tests/images/comment.jp2") as im: for path in ("Tests/images/9bit.j2k", "Tests/images/comment.jp2"):
assert im.info["comment"] == b"Created by OpenJPEG version 2.5.0" with Image.open(path) as im:
assert im.info["comment"] == b"Created by OpenJPEG version 2.5.0"
# Test an image that is truncated partway through a codestream # Test an image that is truncated partway through a codestream
with open("Tests/images/comment.jp2", "rb") as fp: with open("Tests/images/comment.jp2", "rb") as fp:

View File

@ -52,6 +52,12 @@ zlib library, and what version of zlib-ng is being used::
Other Changes Other Changes
============= =============
Reading JPEG 2000 comments
^^^^^^^^^^^^^^^^^^^^^^^^^^
When opening a JPEG 2000 image, the comment may now be read into
:py:attr:`~PIL.Image.Image.info` for J2K images, not just JP2 images.
zlib-ng in wheels zlib-ng in wheels
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^

View File

@ -252,6 +252,7 @@ class Jpeg2KImageFile(ImageFile.ImageFile):
if sig == b"\xff\x4f\xff\x51": if sig == b"\xff\x4f\xff\x51":
self.codec = "j2k" self.codec = "j2k"
self._size, self._mode = _parse_codestream(self.fp) self._size, self._mode = _parse_codestream(self.fp)
self._parse_comment()
else: else:
sig = sig + self.fp.read(8) sig = sig + self.fp.read(8)
@ -262,6 +263,9 @@ class Jpeg2KImageFile(ImageFile.ImageFile):
if dpi is not None: if dpi is not None:
self.info["dpi"] = dpi self.info["dpi"] = dpi
if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"):
hdr = self.fp.read(2)
length = _binary.i16be(hdr)
self.fp.seek(length - 2, os.SEEK_CUR)
self._parse_comment() self._parse_comment()
else: else:
msg = "not a JPEG 2000 file" msg = "not a JPEG 2000 file"
@ -296,10 +300,6 @@ class Jpeg2KImageFile(ImageFile.ImageFile):
] ]
def _parse_comment(self) -> None: def _parse_comment(self) -> None:
hdr = self.fp.read(2)
length = _binary.i16be(hdr)
self.fp.seek(length - 2, os.SEEK_CUR)
while True: while True:
marker = self.fp.read(2) marker = self.fp.read(2)
if not marker: if not marker: