diff --git a/Tests/images/9bit.j2k b/Tests/images/9bit.j2k new file mode 100644 index 000000000..174f565fc Binary files /dev/null and b/Tests/images/9bit.j2k differ diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index bd114aa11..00eeb0cf9 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -446,3 +446,9 @@ def test_plt_marker() -> None: hdr = out.read(2) length = _binary.i16be(hdr) out.seek(length - 2, os.SEEK_CUR) + +def test_9bit(): + # Test 9-bit images are decoded to I;16 + with Image.open("Tests/images/9bit.j2k") as im: + assert im.mode == "I;16" + assert im.size == (128, 128) diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index 27f8fbbd0..925a9148c 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -114,7 +114,7 @@ def _parse_codestream(fp): size = (xsiz - xosiz, ysiz - yosiz) if csiz == 1: - if (yrsiz[0] & 0x7F) > 8: + if (yrsiz[0] & 0x7F) + 1 > 8: mode = "I;16" else: mode = "L"