3 }\ @sddlmZmZddlZddlZddlZdZddZddZGd d d ejZ d d Z d dZ ej e j e e eje j e eje j ddddddgeje j ddS))Image ImageFileNz0.1c Cs|jd}tjd|d}||j|d}tjd|\ }}}}}}} } } } } dg| }dg| }dg| }x8t| D],}tjd|dd|\||<||<||<qvW||||f}| d kr|dd @d krd }nd }n0| dkrd}n"| dkrd}n| dkrd}nd}||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>Hrz >HHIIIIIIIIHNz>BBB$rzI;16LLARGBRGBA)readstructunpack unpack_fromrange)fphdrZlsizZsizZrsizZxsizZysizZxosizZyosizZxtsizZytsizZxtosizZytosizZcsizZssizZxrsizZyrsizisizemoderm/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-i584jbuk/Pillow/PIL/Jpeg2KImagePlugin.py_parse_codestreams, "   , rcCsd}d}xtjd|jd\}}|dkrDtjd|jdd}d}nd}||krXtd|d krr|j||}Pq |d kr|jd d krd }|j||d tjq |j||tjq W|dkrtdd}d}d}d} tj|} xtjd| jd\}}|dkr$tjd| jdd}d}nd}| j||} |dkrtjd| \} } } }}}}| | f}|r| dkr|d@dkrd}n>| dkrd}n.| dkrd}n| dkrd}n| d krd}Pq|dkrtj d| \}}}|dkrtj d| dd}|dkrV| dkr$|d@dkr$d}n.| dkr4d}n| dkrDd}n| d krRd}Pq|dkr| dkr~|d@dkr~d}n| dkrd}n| dkrd}Pq|dkr| dkrd}n| d krd}PqW|dks|dkrtd|||fS)zParse the JP2 header box to extract size, component count and color space information, returning a (size, mode, mimetype) tuple.Nz>I4sr rz>QrzInvalid JP2 header lengthsjp2hsftypr sjpx z image/jpxzcould not find JP2 headersihdrz>IIHBBBBrzI;16r rr rr rscolrz>BBBz>IzMalformed jp2 header) rrr SyntaxErrorseekosSEEK_CURioBytesIOr)rheadermimetypeZlboxZtboxZhlenrrZbpcZncZhiocontentheightwidthcZunkcZiprmethprecZapproxcsrrr_parse_jp2_header<s                r.c@s$eZdZdZdZddZddZdS)Jpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)cCsP|jjd}|dkr.d|_t|j\|_|_nB||jjd}|dkrhd|_t|j}|\|_|_|_ntd|j dks|jdkrtdd |_ d |_ d }d }y|jj }t j|j}Wnjtk r$d}y4|jj}|jjd tj|jj}|jj|Wntk rd}YnXYnXd d|j d |j|j |j ||ffg|_dS)Nr sOQj2kr s jP jp2znot a JPEG 2000 filezunable to determine size/moderrjpeg2kr3r3r3)rr)rrcodecr_sizerr.Zcustom_mimetyperrreducelayersfilenor!fstatst_size Exceptiontellr r#SEEK_ENDtile)selfsigr%fdlengthposrrr_opens<      zJpeg2KImageFile._opencCs|jrFd|j>}|d?}t|jd||t|jd||f|_|jr|jd}|dd|j|j|dd|ddf}|dd|j|d|fg|_tjj|S)Nrrrr r)rr)r6intrr5r>r7rload)r?poweradjusttt3rrrrFs  *zJpeg2KImageFile.loadN)__name__ __module__ __qualname__formatformat_descriptionrDrFrrrrr/s(r/cCs |dddkp|dddkS)Nr sOQ s jP r)prefixrrr_acceptsrRcCsH|jdrd}nd}|j}|jdd}|jdd}|jdd}|jdd}|jd d} | dk rt| ttfo|td d | D rtd |jd d} |jdd} |jdd} |jdd} |jdd}|jdd}d}t|dry |j }Wnt k rd}YnX||||| | | | | |||f |_ t j ||dd|jd|fgdS)Nz.j2kr0r1offset tile_offset tile_size quality_modeZratesquality_layerscSsg|]}t|ttfqSr) isinstancerEfloat).0Z quality_layerrrr sz_save..z,quality_layers must be a sequence of numbersnum_resolutionsrZcodeblock_size precinct_size irreversibleF progressionZLRCP cinema_modenorr8r2r3r3)rr)endswithZ encoderinfogetrXlisttupleall ValueErrorhasattrr8r;Z encoderconfigr_saver)ZimrfilenamekindinforSrTrUrVrWr\Z cblk_sizer]r^r_r`rArrrrisN                riz.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz image/jp2)rrrr!r# __version__rr.r/rRriZ register_openrNZ register_saveZregister_extensionsZ register_mimerrrrs#e<8