diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index df686df3222..c01b22d991c 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -440,6 +440,13 @@ def test_pclr() -> None: assert len(im.palette.colors) == 256 assert im.palette.colors[(255, 255, 255)] == 0 + for enumcs in (0, 15, 17): + with open(f"{EXTRA_DIR}/issue104_jpxstream.jp2", "rb") as fp: + data = bytearray(fp.read()) + data[114:115] = bytes([enumcs]) + with Image.open(BytesIO(data)) as im: + assert im.mode == "L" + with Image.open( f"{EXTRA_DIR}/147af3f1083de4393666b7d99b01b58b_signal_sigsegv_130c531_6155_5136.jp2" ) as im: diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index e5d735c7328..cb37735300c 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -176,7 +176,7 @@ def _parse_jp2_header( nc = None dpi = None # 2-tuple of DPI info, or None palette = None - cmyk = False + colr = None while header.has_next_box(): tbox = header.next_box_type() @@ -199,10 +199,16 @@ def _parse_jp2_header( mode = "RGBA" elif tbox == b"colr": meth, _, _, enumcs = header.read_fields(">BBBI") - if cmyk := (meth == 1 and enumcs == 12): - if nc == 4: - mode = "CMYK" - elif tbox == b"pclr" and mode in ("L", "LA"): + if meth == 1: + if enumcs in (0, 15): + colr = "1" + elif enumcs == 12: + colr = "CMYK" + if nc == 4: + mode = "CMYK" + elif enumcs == 17: + colr = "L" + elif tbox == b"pclr" and mode in ("L", "LA") and colr not in ("1", "L"): ne, npc = header.read_fields(">HB") assert isinstance(ne, int) assert isinstance(npc, int) @@ -213,7 +219,7 @@ def _parse_jp2_header( max_bitdepth = bitdepth if max_bitdepth <= 8: if npc == 4: - palette_mode = "CMYK" if cmyk else "RGBA" + palette_mode = "CMYK" if colr == "CMYK" else "RGBA" else: palette_mode = "RGB" palette = ImagePalette.ImagePalette(palette_mode)