)Ej:ddlmZddlZddlZddlZddlmZddlmZm Z m Z m Z dZ e r ddl mZddlmZGd d Zd&dZd'dZd(dZGdde j Zd)dZd*d#Zejejeeejejeejejgd$ejejd%dS)+) annotationsN)cast)Image ImageFile ImagePalette_binaryF)Callable)IOcLeZdZdZddd Zdd ZddZddZddZddZ ddZ dS) BoxReaderz} A small helper class to read fields stored in JPEG2000 header boxes and to easily step into and read sub-boxes. fp IO[bytes]lengthintreturnNonecF||_|dk|_||_d|_dS)Nrr)r has_lengthrremaining_in_box)selfrrs GC:\PYTHON\MyICR_Suite\python\Lib\site-packages\PIL/Jpeg2KImagePlugin.py__init__zBoxReader.__init__%s) A+ " num_bytesboolc|jr'|j|z|jkrdS|jdkr ||jkSdS)NFrT)rrtellrr)rrs r _can_readzBoxReader._can_read+sM ? tw||~~ 9DKGG5  A % % 55 54rbytesc,||sd}t||j|}t ||kr%d|dt |d}t ||jdkr|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"" "w||I&& t99y QiQQSYYQQQC#,,   1 $ $  ! !Y . ! ! r field_formatstrtuple[int | bytes, ...]c~tj|}||}tj||SN)structcalcsizer*unpack)rr+sizer)s r read_fieldszBoxReader.read_fieldsCs6|,,%%}\4000rc~|j}||}ttj||Sr/)rr*r ioBytesIO)rr3r)s r read_boxeszBoxReader.read_boxesHs7$%%D))4000rch|jr*|j|jz|jkSdS)NT)rrrrr)rs r has_next_boxzBoxReader.has_next_boxMs0 ? 7<<>>D$99DKG G4rc|jdkr*|j|jtjd|_t t ttf| d\}}|dkr1t t| dd}d}nd}||ks| ||z sd}t|||z |_|S) Nrrz>I4srz>QzInvalid header length) rrseekosSEEK_CURrtuplerr!r4r r$)rlboxtboxhlenr(s r next_box_typezBoxReader.next_box_typeSs  1 $ $ GLL. < < < "%U +T-=-=f-E-EFF d 199T--d33A677DDDD $;;dnnTD[99;)Cc"" " $t  rN)r)rrrrrr)rrrr)rrrr!)r+r,rr-)rr )rr)rr!) __name__ __module__ __qualname____doc__rr r*r4r8r:rErrr r s #####     1111 1111  rr rrrtuple[tuple[int, int], str]c |d}tj|}|dkrd}t||||dz z}t jd|\ }}}}}} } } } } } ||z || z f} | dkr.t jd|d} | ddzdzd krd }n/d }n,| dkrd }n#| d krd}n| dkrd}nd}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%SIZ marker length must be at least 38z >HHIIIIIIIIHrz>Brr=I;16LLARGBRGBAz"unable to determine J2K image mode)r%r i16be ValueErrorr0 unpack_fromr$)rhdrlsizr(sizrsizxsizysizxosizyosiz_csizr3ssizmodes r_parse_codestreamrfis( ''!**C =  D byy5oo q!! !C=C=O>>:D$dE5!Q1d 5L$, 'D qyy!$R00 GdNa ! # #DDDD   2# :rnumrdenomexp float | Nonec4|dkrdSd|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'rJ)rgrhris r _res_to_dpirns. zzt #IS !eem 44retuple[tuple[int, int], str, str | None, tuple[float, float] | None, ImagePalette.ImagePalette | None]ct|}d}d}|rj|}|dkr|}n;|dkr!|dddkrd}|j|Jd}d}d}d}d} d} d} |r|}|dkr|d \} } }}t | t sJt | t sJt |t sJ| | f}|d kr |d zd krd }n|d krd}n|dkrd}n|dkrd}n|dkrd}n|dkrD|d\}}}}|d kr"|dvrd} n|dkr d} |dkrd}n|dkrd} n}|dkrH|dvrC| dvr>|d\}}t |t sJt |t sJd}|d d!|zzD]!}t |t sJ||kr|}"|d kr|dkr | dkrdnd}nd}tj|} t|D]p}g}|d d!|zzD].}t |t sJ| |/| t|q|dkrd"nd#}n.|d$kr'|}|r|}|d%kr|d&\}}}}}} t |t sJt |t sJt |t sJt |t sJt |t sJt | t sJt||| }!t|||}"|!|"|!|"f} n||||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>IIHBrrOr=rPrQrMrRrSrTrUrVscolrz>BBBI)r1 CMYKspclr)rQrR)rrrQz>HB>BPPAsres srescz>HHHHBBzMalformed JP2 header)r r:rEr8r4 isinstancerrrangeappendgetcolorrArnr$)$rreaderheadermimetyperCr3rebpcncdpipalettecolrheightwidthmethrbenumcsnenpc max_bitdepthbitdepth palette_modeicolorvaluerestresvrcnvrcdhrcnhrcdvrcehrcehresvresr(s$ r_parse_jp2_headerrs6r]]F FH     '##%% 7??&&((F  W__!!%((+w66&     '     D D C B CG D     D##%% 7??%+%7%7%@%@ "FE2sfc** * **eS)) ) ))c3'' ' ''6?DQwwC$J!++qqqq W__!'!3!3G!d|_t|j\|_|_|n||jdz}|dkrd|_t|j}|\|_|_|_}|_ | ||j d<|jd d rj|jd }tj |}|j|d z tj|nd }t#|d |_d |_d }d } |j}tj|j}n#t.$rd } |j}|jd t2j|j}|j|n#t.$rd }YnwxYwYnwxYwt7jdd|jzd |j|j|j||fg|_dS)NrUOQj2kr= jP jp2rrssjp2cOQrMznot a JPEG 2000 filerrjpeg2krr)rr%codecrf_size_mode_parse_commentrcustom_mimetyperinfoendswithr rWr>r?r@r$_reducelayersfilenofstatst_size Exceptionrr6SEEK_ENDr_Tiler3tile) rsigrrrZrr(fdposs r_openzJpeg2KImageFile._open sdw"""gll1oo % % %DJ%6tw%?%? "DJ    ! ! ! ! Q'C===" *4733RXO DJ(r?r@)rmarkertyprZrr(s rrzJpeg2KImageFile._parse_commentBsw""" 6W\\!__F )Cl""',,q//C]3''Fzz/ oo%d{{'+w||FQJ'?'?'C )$ VaZ555% 6rVCallable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] | intc8|jptjSr/)rsuperreduce)r __class__s rrzJpeg2KImageFile.reduceXs|-uww~-rrrc||_dSr/)r)rrs rrzJpeg2KImageFile.reduceds  rImage.core.PixelAccess | Nonec$|jr|jrd|jz}|dz }t|jd|z|z t|jd|z|z f|_|jd}t |dt sJ|dd|j|j|dd|ddf}tj |dd|jz|d|g|_tj |S)NrrrSrUrrM) rrrr3rrzrArrrload)rpoweradjusttt3s rrzJpeg2KImageFile.loadhs 9 N N%EaZFTYq\F*e344TYq\F*e344DJ  ! AadE** * **A$q'4<ad1gqtAwGB"1v /A1Q4LLMDI"''---r)rr)rr)rrrr)rr) rFrGrHformatformat_descriptionrrpropertyrsetterr __classcell__)rs@rrr s F03 3 3 3 j6666, . . . . .X . ]]........rrprefixr!rc,|dS)N)rr) startswith)rs r_acceptrzs   F  rim Image.Imagefilename str | bytesrcD|j}t|tr|}|ds|ddrd}nd}|dd}|dd}|dd}|d d }|d d} | Ft| t tfrtd | Dsd } t| |dd} |dd} |dd} |dd}|dd}|dd}|dd}|dd}|d}t|tr|}|dd}d}t|dr( | }n#t$rd}YnwxYw||||| | | | ||||||||f|_ tj||tjdd|jzd|gdS)Ns.j2kno_jp2Frroffset tile_offset tile_size quality_moderatesquality_layersc3NK|] }t|ttfV!dSr/)rzrfloat).0 quality_layers r z_save..sA  8EJ}sEl 3 3      rz,quality_layers must be a sequence of numbersnum_resolutionsrcodeblock_size precinct_size irreversible progressionLRCP cinema_modenomctsignedrpltrrrr) encoderinforzr,encodergetlistrAallrXhasattrrr encoderconfigr_saverr3)rrrrkindrrrrrr(r cblk_sizerrrrrrrrrs rrrs >D(C  %??$$!!TXXh%>%> XXh % %F((=$//Kd++I88NG44LXX.55N!>D%=11"   IW     " =oohh0!44O)400IHH_d33M88NE22L((=&11K((=$//K ((5!  C XXh & &Fhhy!!G'3#.."" ((5% C Br8 BB   BBB     !B&OBY_Xv7GDQQRSSSSSs.I II)z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz image/jp2)rrrrK)rgrrhrrirrrj)rrrro)rr!rr)rrrrrrrr) __future__rr6r?r0typingrrrrr TYPE_CHECKINGcollections.abcr r r rfrnrrrr register_openr register_saveregister_extensions register_mimerJrrrs #""""" 555555555555 ((((((GGGGGGGGTD5555n.n.n.n.jn.n.n.n.n.i)n.n.n.b@T@T@T@TNO*OWEEEO*E222LLLO*K88888r