K il6ddlmZddlZddlZddlZddlmZddlmZm Z m Z m Z dZ e r ddl mZddlmZGd d Zdd Zdd Z dd ZGdde jZddZddZej.ej0eeej2ej0eej4ej0gdej6ej0dy)) annotationsN)cast)Image ImageFile ImagePalette_binaryF)Callable)IOcJeZdZdZd d dZd dZd dZddZddZddZ ddZ y ) BoxReaderz} A small helper class to read fields stored in JPEG2000 header boxes and to easily step into and read sub-boxes. cB||_|dk\|_||_d|_y)Nr)fp has_lengthlengthremaining_in_box)selfrrs [/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py__init__zBoxReader.__init__%s# A+ "c|jr+|jj|z|jkDry|jdk\r||jkSy)NFrT)rrtellrr)r num_bytess r _can_readzBoxReader._can_read+sH ??tww||~ 9DKKG  A % 5 55 5rc|j|s d}t||jj|}t ||krd|dt |d}t ||j dkDr|xj |zc_|S)NzNot enough data in headerzExpected to read z bytes but only got .r)r SyntaxErrorrreadlenOSErrorr)rrmsgdatas r _read_byteszBoxReader._read_bytes5s~~i(-Cc" "ww||I& t9y %i[0DSYKqQC#,   1 $  ! !Y . ! rcztj|}|j|}tj||SN)structcalcsizer$unpack)r field_formatsizer#s r read_fieldszBoxReader.read_fieldsCs1|,%}}\400rcz|j}|j|}ttj||Sr&)rr$r ioBytesIO)rr+r#s r read_boxeszBoxReader.read_boxesHs3$$%D)400rc|jr4|jj|jz|jkSy)NT)rrrrr)rs r has_next_boxzBoxReader.has_next_boxMs0 ??77<<>D$9$99DKKG Grc|jdkDr4|jj|jtjd|_t t ttf|jd\}}|dk(r%t t|jdd}d}nd}||ks|j||z s d}t|||z |_|S) Nrrz>I4srz>QzInvalid header length) rrseekosSEEK_CURrtupleintbytesr,rr)rlboxtboxhlenr"s r next_box_typezBoxReader.next_box_typeSs  1 $ GGLL.. < "%U +T-=-=f-EF d 19T--d3A67DDD $;dnnTD[9)Cc" " $t  rN)r)r IO[bytes]rr:returnNone)rr:rAbool)rr:rAr;)r*strrAztuple[int | bytes, ...])rAr )rArC)rAr;) __name__ __module__ __qualname____doc__rrr$r,r0r2r?rrr r s* #  1 1  rr c |jd}tj|}||j|dz z}tjd|\ }}}}}}} } } } } ||z ||z f} | dk(r1tjd|d} | ddzdzdkDrd } | | fSd } | | fS| dk(rd } | | fS| d k(rd } | | fS| dk(rd} | | fSd}t |)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)rr i16ber' unpack_fromr)rhdrlsizsizrsizxsizysizxosizyosiz_csizr+ssizmoder"s r_parse_codestreamrcis* ''!*C == D q! !C=C=O=O>:D$dE5!Q1d 5L$, 'D qy!!$R0 GdNa ! #D :D :  :  :  :3#rc0|dk(ryd|zd|zzd|zz 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'rI)numdenomexps r _res_to_dpirjs* z #IS !eem 44rct|}d}d}|jrU|j}|dk(r|j}n/|dk(r|j dddk(rd}|jrU|Jd}d}d}d}d} d} |jr|j}|dk(r|j d \} } }}t | t sJt | t sJt |t sJ| | f}|d k(r |d zd kDrd }nY|d k(rd}nP|dk(rd}nG|dk(rd}n>|dk(r8d}n4|dk(r+|dk(r&|j d\} }}}| d k(r|dk(rd}n|dk(r |dvr|j d\}}t |t sJt |t sJd}|j dd|zzD]}t |t sJ||kDs|}|d krtj|dk(rdnd} t|D]]}g}|j dd|zzD]%}t |t sJ|j|'| jt|_|dk(rdnd}n|d k(r|j}|jr|j}|d!k(r|j d"\}}}}}}t |t sJt |t sJt |t sJt |t sJt |t sJt |t sJt|||}t|||} || || f} n|jr|jr|| d#}!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>IIHBrrMr5rNrOrKrPrQrRrSrTscolrz>BBBI CMYKspclr)rOrPz>HB>BPPAsres srescz>HHHHBBzMalformed JP2 header)r r2r?r0r, isinstancer:rrangeappendgetcolorr9rjr)"rreaderheadermimetyper=r+rbbpcncdpipaletteheightwidthmethr_enumcsnenpc max_bitdepthbitdepthicolorvaluerestresvrcnvrcdhrcnhrcdvrcehrcehresvresr"s" r_parse_jp2_headerrsr]F FH    ##% 7?&&(F  W_!!%(+w6&        D D C B CG    ##% 7?%+%7%7%@ "FE2sfc* **eS) ))c3' ''6?DQwC$J!+qqqq W_q!'!3!3G!< D!QqyVr\ W_!4((/GBb#& &&c3' ''L"..scCi/@A ,!(C000l*#+L ,q &33cQhFERr3A')E!'!3!3C394E!F,)%555 U+,$$U5\2 3 #ckst W_##%C""$((*7?9<9S6D$dD$%dC000%dC000%dC000%dC000%dC000%dC000&tT48D&tT48D'D,<#Tl""$W    v |t|$# xg --rcteZdZdZdZddZddZe d fd Zejd dZd dZ xZ S) Jpeg2KImageFileJPEG2000zJPEG 2000 (ISO 15444)c J|jjd}|dk(r;d|_t|j\|_|_|j n||jjdz}|dk(rd|_t|j}|\|_|_|_}|_ |||jd<|jjdjd r{|jjd }tj|}|jj|d z tj |j n d }t#|d |_d |_d }d } |jj)}tj*|j,}t7j8dd|j:zd |j|j$|j&||fg|_y#t.$rd } |jj1}|jjd t2j4|jj1}|jj|n#t.$rd }YnwxYwYwxYw)NrSOQj2kr5 jP jp2r{rlsjp2cOQrKznot a JPEG 2000 filerrjpeg2krr)rrcodecrc_size_mode_parse_commentrcustom_mimetyper|infoendswithr rUr6r7r8r_reducelayersfilenofstatst_size Exceptionrr.SEEK_ENDr_Tiler+tile) rsigrwr{rWrr"fdposs r_openzJpeg2KImageFile._opens ggll1o % %DJ%6tww%? "DJ    ! Q'C==" *4773RXO DJ(z_save..s  8EJ}sEl 3 s "z,quality_layers must be a sequence of numbersnum_resolutionsrcodeblock_size precinct_size irreversible progressionLRCP cinema_modenomctsignedrpltrrrr) encoderinforrrDencodergetlistr9all ValueErrorhasattrrr encoderconfigr_saverr+)imrfilenamerkindrrrrrr"r cblk_sizerrrrrrrrrs rrrps% >>D(C ??$!TXXh%> XXh %F((=$/Kd+I88NG4LXX.5N!>D%=1  IW  =ohh0!4O)40IHH_d3M88NE2L((=&1K((=$/K ((5! C XXh &Fhhy!G'3.." ((5% C Br8 B    !B&OOBY__Xv7GDQRS- B sH++ H98H9)z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz image/jp2)rr@rAztuple[tuple[int, int], str])rgr:rhr:rir:rAz float | None)rr@rAzetuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None])rr;rArC)rz Image.Imagerr@rz str | bytesrArB) __future__rr.r7r'typingrrrrr TYPE_CHECKINGcollections.abcr r r rcrjrrrr register_openr register_saveregister_extensions register_mimerIrrrs # 55 (GGT>5b.b.b.Ri.i))i.X@TNO**OWEO**E2LO**K8r