B .^" @sddlZddlZddlZddlmZmZddZddZGdd d ejZd d Z d d Z e ej ee e ej e eej ddddddgeej ddS)N)Image ImageFilec Cs|d}td|d}|||d}td|\ }}}}}}} } } } } dg| } dg| } dg| } x8t| D],}td|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)fphdrZlsizZsizZrsizZxsizZysizZxosizZyosiz_ZcsizZssizZxrsizZyrsizisizemoder9/tmp/pip-install-mwhup7aw/Pillow/PIL/Jpeg2KImagePlugin.py_parse_codestreams.    , rcCsd}d}xtd|d\}}|dkrDtd|dd}d}nd}||krXtd|d krr|||}Pq |d kr|d d krd }|||d tjq |||tjq W|dkrtdd}d}d}d} t|} xtd| d\}}|dkr$td| dd}d}nd}| ||} |dkrtd| \} } } }}}}| | f}|r| dkr|d@dkrd}n>| dkrd}n.| dkrd}n| dkrd}n| d krd}Pq|dkrt d| \}}}|dkrt 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_header8s                r/csFeZdZdZdZddZefddZejddZdd Z Z S) Jpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)c CsP|jd}|dkr.d|_t|j\|_|_nB||jd}|dkrhd|_t|j}|\|_|_|_ntd|j dks|jdkrtdd |_ d |_ d }d }y|j }t |j}Wnjtk r$d }y4|j}|jd tj|j}|j|Wntk rd }YnXYnXd d |j d |j|j |j ||ffg|_dS) Nr sOQj2kr s jP jp2znot a JPEG 2000 filezunable to determine size/moderjpeg2k)rr)rrcodecr_sizerr/Zcustom_mimetyper r_reducelayersfilenor"fstatst_size Exceptiontellr!r$SEEK_ENDtile)selfsigr&fdlengthposrrr_opens@     zJpeg2KImageFile._opencs|jp tjS)N)r7superreduce)r@) __class__rrrGszJpeg2KImageFile.reducecCs ||_dS)N)r7)r@valuerrrrGscCs|jr|jrd|j>}|d?}t|jd||t|jd||f|_|jd}|dd|j|j|dd|ddf}|dd|j|d|fg|_tj|S)Nrrrr )rrr)r?r7intrr6r8rload)r@poweradjusttt3rrrrKs   *zJpeg2KImageFile.load) __name__ __module__ __qualname__formatformat_descriptionrEpropertyrGsetterrK __classcell__rr)rHrr0s .r0cCs |dddkp|dddkS)Nr sOQ s jP r)prefixrrr_acceptsrZc CsF|drd}nd}|j}|dd}|dd}|dd}|dd}|d d} | dk rt| ttfr~td d | Dstd |d d} |dd} |dd} |dd} |dd}|dd}d}t|dry | }Wnt k rd}YnX||||| | | | | |||f |_ t ||dd|jd|fgdS)Nz.j2kr1r2offset tile_offset tile_size quality_modeZratesquality_layerscSsg|]}t|ttfqSr) isinstancerJfloat).0Z quality_layerrrr sz_save..z,quality_layers must be a sequence of numbersnum_resolutionsrZcodeblock_size precinct_size irreversibleF progressionZLRCP cinema_modenor3r9r4)rr)endswithZ encoderinfogetr`listtupleall ValueErrorhasattrr9r<Z encoderconfigr_saver)Zimrfilenamekindinfor[r\r]r^r_rdZ cblk_sizererfrgrhrBrrrrqsP                rqz.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz image/jp2)r$r"rrrrr/r0rZrqZ register_openrSZ register_saveZregister_extensionsZ register_mimerrrrs"eN =