B ]lA@sddlmZddlZddlZddlZddlZddlmZmZm Z ddl m Z m Z mZmZddlmZddlmZdZd d Zd d Zd dZddZddZddefddefddefddefddefddefdd efd!d"efd#d$d%efd&d'efd(d)efd*d+efd,d-efd.d/efd0d1efd2d3d4d5d6d7d8d9d:d;defd?d@efdAdBefdCdDefdEdFefdGdHefdIdJefdKdLefdMdNefdOdPefdQdRefdSdTefdUdVefdWdXefdYdZefd[d\efd]d^efd_d`efdadbefdcddefdedfefdgdhdidjdkdldmdndodpdqdrdsdtdduefdv?ZdwdxZGdydzdzejZd{d|Zd}d~ZddZ dddddddZ!dZ"ddddZ#ddZ$ddZ%ddZ&ddZ'dddZ(e)ej*e(ee+ej*e&e,ej*ddddge-ej*ddS))print_functionN)Image ImageFileTiffImagePlugin)i8i16bei32beo8) isStringType)presetsz0.6cCs&t|jdd}t|j|dS)N)i16fpreadr _safe_read)selfmarkernr5/tmp/pip-build-ktz6qwqq/Pillow/PIL/JpegImagePlugin.pySkip8src Cst|jdd}t|j|}d|d@}||j|<|j||f|dkr|dddkrt|d|jd<}t |d |jd <y$t |d }t|d t|d f}Wnt k rYn(X|dkr||jd<||jd<||jd<nd|dkr|dddkrd|jkrL||jd<n.|dkrH|dddkrH||jd<n|dkrt|dddkrt|j |n|dkr|dddkrL|dd}d} i} x|| | ddkr| d7} t|| } | d7} t || } d| | } | d@r| d7} t || } | d7} || | | }| dkrrt |ddd t|dd t |d dd t|ddd!}|| | <| | } | d@r| d7} qW| |jd"<n|d#kr|ddd$krt|d|jd%<yt |d}Wnt k rYn X||jd&<nF|dkrL|ddd'krL|dd|jd(<|j|d|jd)<d|jkr d|jkr y|}|d*}|d+}yt|d|d}Wntk r|}YnX|d,kr|d-9}t|d.t|d.f|jd<Wn&tttfk r d/|jd<YnXdS)0Nr zAPP%disJFIFZjfifZ jfif_version rdpi jfif_unit jfif_densityisExifexifisFPXRZflashpix s ICC_PROFILEisPhotoshop 3.0rs8BIMii)Z XResolutionZDisplayedUnitsXZ YResolutionZDisplayedUnitsY photoshopisAdobeadobeadobe_transformsMPFmpZmpoffseti(igRQ@g?)Hr*)rrrrrappapplistappendinfodivmodr Exceptionicclisti32tellgetexiffloat TypeErrorintKeyError SyntaxErrorZeroDivisionError)rrrsr+versionr r!blocksoffsetr%codeZname_lensizedatar'r"Zresolution_unitZ x_resolutionrrrrAPP=s                    "rBcCs@t|jdd}t|j|}||jd<|jd|fdS)Nr COM)rrrrrr+r,r-)rrrr;rrrrCs rCc Cst|jdd}t|j|}t|ddt|ddf|_t|d|_|jdkrjtd|jt|d|_ |j dkrd|_ n2|j dkrd |_ n |j d krd |_ ntd |j |d krd|j d<|j d<|j rP|j t|j ddt|j kr?r ))rrrrrr)r rrrrr)r r rrrrcsJfddttDx*tD]\}fddtD|<q$WS)Ncsg|]}|kr|qSrr).0key)qtablesrr Tsz(convert_dict_qtables..csg|] }|qSrr)rrX)tablerrrVs)rUrS enumerate zigzag_index)ridxr)rrrconvert_dict_qtablesSsrcCsZt|dr|jdkrdS|jddd|jddd|jddd}t|dS)NrP)rrrrr)r )hasattrrPrV samplingsr)rZsamplingrrr get_samplingZs6rc Csyt|j}Wn"tk r0td|jYnX|j}dd|ddD}|dd}|dd }|d }|d krd}d }d }nv|tkrt|} d}| dd }| d }nJt|tst d n6|tkrt|dd }t |r|tkrt|d }|dkr d}nV|dkrd}nF|dkr,d}n6|dkr.r)rrqualityr subsamplingrrZkeepr^zInvalid quality settingz4:4:4z4:2:2rz4:2:0r z4:1:1rgz3Cannot use 'keep' when original image is not a JPEGc s*|dkr |St|rfydd|DWntk rFtdYn XfddtdtdD}t|tttfr&t|trt |}nt|trt|}dt|krdksntdx`t |D]T\}}y t|dkrt t d |}Wnt k rtdYqXt|||<qW|SdS) NcSs.g|]&}|dddD] }t|qqS)#rr)splitr7)rlinenumrrrrsz3_save..validate_qtables..zInvalid quantization tablecsg|]}||dqS)@r)rr;)linesrrrsrrrz$None or too many quantization tablesr\) r splitlinesrrUrS isinstancetuplelistrrrr6r])rrrr)rrvalidate_qtabless2    z_save..validate_qtablesrJrKr$iz>Hss ICC_PROFILErGFrHoptimizer"ZsmoothZ streamtyperFr_rri)RAWMODErQr8IOErrorZ encoderinforr rr7rr rrgetattrr-rpackrSr rrtobytesZ encoderconfigr@maxrZMAXBLOCK_save)rrrrpr.rrrrpresetrextrarKZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERmarkersrXrr@rGrr"bufsizerrrrhs                  &       rcCsRddl}ddl}|}|dd||gy||Wntk rLYnXdS)NrZcjpegz-outfile)r|rz_dumprrr)rrrr|rzr{rrr _save_cjpegsrc Cstt||}y0|}|ddkr8ddlm}|||}Wn4ttfk rRYntk rnt dYnX|S)Nir) MpoImageFilezTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file) rfrZMpoImagePluginrZadoptr6 IndexErrorr9warningswarn)rrrZmpheaderrrrr jpeg_factorys    r z.jfifz.jpez.jpgz.jpegz image/jpeg)NN). __future__rr]rrrrjrrr_binaryrrrr r2r Z_utilr Z JpegPresetsr __version__rrBrCrZr`rkrerfrrrrrrrrrrr Z register_openrZ register_saveZregister_extensionsZ register_mimerrrr#s   v 0J