1919import os
2020import struct
2121
22- from . import Image , ImageFile , _binary
22+ from . import Image , ImageFile , ImagePalette , _binary
2323
2424
2525class BoxReader :
@@ -162,6 +162,7 @@ def _parse_jp2_header(fp):
162162 bpc = None
163163 nc = None
164164 dpi = None # 2-tuple of DPI info, or None
165+ palette = None
165166
166167 while header .has_next_box ():
167168 tbox = header .next_box_type ()
@@ -179,6 +180,14 @@ def _parse_jp2_header(fp):
179180 mode = "RGB"
180181 elif nc == 4 :
181182 mode = "RGBA"
183+ elif tbox == b"pclr" and mode in ("L" , "LA" ):
184+ ne , npc = header .read_fields (">HB" )
185+ bitdepths = header .read_fields (">" + ("B" * npc ))
186+ if max (bitdepths ) <= 8 :
187+ palette = ImagePalette .ImagePalette ()
188+ for i in range (ne ):
189+ palette .getcolor (header .read_fields (">" + ("B" * npc )))
190+ mode = "P" if mode == "L" else "PA"
182191 elif tbox == b"res " :
183192 res = header .read_boxes ()
184193 while res .has_next_box ():
@@ -195,7 +204,7 @@ def _parse_jp2_header(fp):
195204 msg = "Malformed JP2 header"
196205 raise SyntaxError (msg )
197206
198- return size , mode , mimetype , dpi
207+ return size , mode , mimetype , dpi , palette
199208
200209
201210##
@@ -217,7 +226,7 @@ def _open(self):
217226 if sig == b"\x00 \x00 \x00 \x0c jP \x0d \x0a \x87 \x0a " :
218227 self .codec = "jp2"
219228 header = _parse_jp2_header (self .fp )
220- self ._size , self ._mode , self .custom_mimetype , dpi = header
229+ self ._size , self ._mode , self .custom_mimetype , dpi , self . palette = header
221230 if dpi is not None :
222231 self .info ["dpi" ] = dpi
223232 if self .fp .read (12 ).endswith (b"jp2c\xff \x4f \xff \x51 " ):
0 commit comments