B ]! @sddlZddlZddlZddlmZmZdZddZddZGd d d ejZ d d Z d dZ e e j e e ee j e ee j ddddddgee j ddS)N)Image ImageFilez0.1c 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_ZcsizZssizZxrsizZyrsizisizemoder7/tmp/pip-build-ktz6qwqq/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_header<s                r/c@s$eZdZdZdZddZddZdS)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 rreducelayersfilenor"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|_tj|S)Nrrrr )rrr)r7intrr6r?r8rload)r@poweradjusttt3rrrrGs  *zJpeg2KImageFile.loadN)__name__ __module__ __qualname__formatformat_descriptionrErGrrrrr0s.r0cCs |dddkp|dddkS)Nr sOQ s jP r)prefixrrr_acceptsrSc 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) isinstancerFfloat).0Z quality_layerrrr sz_save..z,quality_layers must be a sequence of numbersnum_resolutionsrZcodeblock_size precinct_size irreversibleF progressionZLRCP cinema_modenor3r9r4)rr)endswithZ encoderinfogetrYlisttupleall ValueErrorhasattrr9r<Z encoderconfigr_saver)ZimrfilenamekindinforTrUrVrWrXr]Z cblk_sizer^r_r`rarBrrrrjsP                rjz.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz image/jp2)r$r"rrr __version__rr/r0rSrjZ register_openrOZ register_saveZregister_extensionsZ register_mimerrrrs"eD =