a :jg5@sddlmZddlZddlZddlZddlmZddlmZm Z ddl m Z m Z m Z mZGdddZd d d d d ZdddddddZd dd ddZGddde j ZdddddZdd ddd d!d"Ze ejeee ejee ejgd#e ejd$dS)%) annotationsN)Callable)IOcast)Image ImageFile ImagePalette_binaryc@s~eZdZdZdddddddZdd d d d Zdd d ddZdddddZddddZd dddZ d dddZ dS) BoxReaderz} A small helper class to read fields stored in JPEG2000 header boxes and to easily step into and read sub-boxes. IO[bytes]intNone)fplengthreturncCs ||_|dk|_||_d|_dS)Nrr )r has_lengthrremaining_in_box)selfrrr?/usr/local/lib/python3.9/site-packages/PIL/Jpeg2KImagePlugin.py__init__!s zBoxReader.__init__bool) num_bytesrcCs:|jr|j||jkrdS|jdkr2||jkSdSdS)NFrT)rrtellrr)rrrrr _can_read's   zBoxReader._can_readbytescCsh||sd}t||j|}t||krLd|dt|d}t||jdkrd|j|8_|S)NzNot enough data in headerzExpected to read z bytes but only got .r)r SyntaxErrorrreadlenOSErrorr)rrmsgdatarrr _read_bytes1s    zBoxReader._read_bytesstrztuple[int | bytes, ...]) field_formatrcCs t|}||}t||SN)structcalcsizer%unpack)rr'sizer$rrr read_fields?s  zBoxReader.read_fieldsrcCs |j}||}tt||Sr()rr%r ioBytesIO)rr,r$rrr read_boxesDs zBoxReader.read_boxescCs$|jr|j|j|jkSdSdS)NT)rrrrrrrrr has_next_boxIszBoxReader.has_next_boxcCs|jdkr|j|jtjd|_ttttf| d\}}|dkr`tt| dd}d}nd}||ksz| ||sd}t ||||_|S) Nrr z>I4srz>QzInvalid header length) rrseekosSEEK_CURrtuplerrr-rr)rZlboxtboxZhlenr#rrr next_box_typeOs  zBoxReader.next_box_typeN)r ) __name__ __module__ __qualname____doc__rrr%r-r1r3r;rrrrr s r r ztuple[tuple[int, int], str])rrc Cs|d}t|}|||d}td|\ }}}}}}} } } } } ||||f} | dkrtd|d} | dd@ddkrd } qd } n6| dkrd } n(| d krd } n| dkrd} n d}t|| | fS)zParse the JPEG 2000 codestream to extract the size and component count from the SIZ marker segment, returning a PIL (size, mode) tuple.z >HHIIIIIIIIHrz>B&rr5I;16LLARGBRGBAz"unable to determine J2K image mode)r r i16ber) unpack_fromr)rhdrZlsizZsizZrsizZxsizZysizZxosizZyosiz_Zcsizr,Zssizmoder#rrr_parse_codestreames*  rOrz float | None)numdenomexprcCs$|dkr dSd|d|d|S)zConvert JPEG2000's (numerator, denominator, exponent-base-10) resolution, calculated as (num / denom) * 10^exp and stored in dots per meter, to floating-point dots per inch.rN i'r)rPrQrRrrr _res_to_dpisrUzetuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None]c"Cst|}d}d}|rT|}|dkr4|}qTq|dkr|dddkrd}q|dus`Jd}d}d}d}d} d} |rX|}|dkr2|d \} } }}t| tsJt| tsJt|tsJ| | f}|d kr|d @d krd }n>|d krd}n.|dkrd}n|dkr"d}n|dkrVd}qx|dkrr|dkrr|d\} }}}| d krV|dkrVd}qx|dkr||dvr||d\}}t|tsJt|tsJd}|dd|D]$}t|tsJ||kr|}q|d krVt|dkr dnd} t|D]L}g}|dd|D] }t|tsHJ| |q4| t |q|dkrvdnd}qx|d krx|}|rx|}|d!kr|d"\}}}}}}t|tsJt|tsJt|tsJt|tsJt|ts Jt|tsJt |||}t |||} |durV| durV|| f} qxqqx|dusl|durxd#}!t |!|||| | fS)$zParse the JP2 header box to extract size, component count, color space information, and optionally DPI information, returning a (size, mode, mimetype, dpi) tuple.Nsjp2hsftypz>4srsjpx z image/jpxsihdrz>IIHBrrBr5rCrDr@rErFrGrHrIscolrz>BBBI ZCMYKspclr)rDrEz>HB>BPZPAsres srescz>HHHHBBzMalformed JP2 header)r r3r;r1r- isinstancerr rangeappendZgetcolorr9rUr)"rreaderheadermimetyper:r,rNZbpcncdpipaletteheightwidthmethrMZenumcsneZnpcZ max_bitdepthZbitdepthicolorvalueresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr#rrr_parse_jp2_headers             rkcsneZdZdZdZddddZddddZed dfd d Zej d dd dd ZddddZ Z S)Jpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)rr.c Csj|jd}|dkr.d|_t|j\|_|_nx||jd}|dkrd|_t|j}|\|_|_|_}|_|dur~||j d<|jd d r| n d }t |d |_ d |_d }d }z|j}t|j}Wnfty:d }z4|j}|jd tj|j}|j|Wnty4d }Yn0Yn0td d|jd |j|j |j||fg|_dS)NrHOQj2kr5 jP jp2rarVsjp2cOQznot a JPEG 2000 filerr jpeg2krr)rr codecrO_size_moderkZcustom_mimetyperbinfoendswith_parse_commentr_reducelayersfilenor7fstatst_size Exceptionrr6r/SEEK_ENDr_Tiler,tile)rsigr^rar#fdrposrrr_opensL       zJpeg2KImageFile._opencCs|jd}t|}|j|dtj|jd}|s}|d?}t|jd||t|jd||f|_|jd}t|dtshJ|dd|j|j|dd|ddf}t |dd|j|d|g|_tj |S)NrrrFrHrrr@) rryrr,rtrZr9rzrrload)rpoweradjusttZt3rrrrPs   *"zJpeg2KImageFile.load) r<r=r>formatformat_descriptionrrxpropertyrsetterr __classcell__rrrrrls0 rlrr)prefixrcCs |dddkp|dddkS)NrHrmrVror)rrrr_acceptbsrz Image.Imagez str | bytesr)imrfilenamercCs|j}t|tr|}|ds.|ddr4d}nd}|dd}|dd}|dd}|d d }|d d} | durt| ttfrtd d | Dsd} t | |dd} |dd} |dd} |dd}|dd}|dd}|dd}|dd}|d}t|tr&|}|dd}d}t |drhz | }Wnt yfd}Yn0||||| | | | ||||||||f|_ t||tdd|jd|gdS) Ns.j2kZno_jp2Frnrpoffset tile_offset tile_size quality_modeZratesquality_layerscss|]}t|ttfVqdSr()rZrfloat).0Z quality_layerrrr sz_save..z,quality_layers must be a sequence of numbersnum_resolutionsrZcodeblock_size precinct_size irreversible progressionZLRCP cinema_modenomctsignedrpltr r{rqrr)Z encoderinforZr&encoderwgetlistr9all ValueErrorhasattrr{r~Z encoderconfigr_saverr,)rrrrvkindrrrrrr#rZ cblk_sizerrrrrrrrrrrrrmsp                     r)z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz image/jp2) __future__rr/r7r)collections.abcrtypingrrrrr r r rOrUrkrlrrZ register_openrZ register_saveZregister_extensionsZ register_mimerrrrs&  J il G