)EjLddlmZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z ddlmZmZmZmZmZmZmZddlmZdd lmZdd lmZdd lmZd Zerdd l mZm Z ddlm!Z!ddl"m#Z#GddeZ$e$j%Z&dPdZ'GddejZ(ddddZ)dQdZ*e+e,ze-e.zejzZ/dRd#Z0dSd'Z1dTd+Z2Gd,d-e Z3dUd.Z4dVd1Z5 dWdXd3Z6dYd5Z7dZd9Z8dVd:Z9d Z:d[d<Z;d\d>Zd_dCZ?d`dEZ@dadGZA dbdcdJZB dddedMZCejDe(jEe(e'ejFe(jEe6ejGe(jEe5ejHe(jEdNejIe(jEdOdS)f) annotationsN)IntEnum)cached_property)Any NamedTuplecast)Image ImageChops ImageFile ImageMathImageOps ImagePalette ImageSequence)i16le)o8)o16le) DeferredErrorF)IOLiteral)_imaging)BufferceZdZdZdZdZdZdS)LoadingStrategyz.. versionadded:: 9.1.0rr N)__name__ __module__ __qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY RGB_ALWAYSDC:\PYTHON\MyICR_Suite\python\Lib\site-packages\PIL/GifImagePlugin.pyrr:s$!!O'($JJJr$rprefixbytesreturnboolc,|dS)N)sGIF87asGIF89a) startswith)r&s r%_acceptr,Is   3 4 44r$ceZdZdZdZdZdZddZdd Zdd Z e ddZ e ddZ ddZdd dZdfd ZddZddZxZS)! GifImageFileGIFzCompuserve GIFFNr( bytes | Nonec|jJ|jd}|r(|dr |j|dSdS)Nr r)fpread)selfss r%datazGifImageFile.dataYsQw""" GLLOO  &1 &7<<!%% %tr$pr'r)ctdt|dD]6}|dz||cxkr||dzcxkr||dzksndS7dS)Nrr rTF)rangelen)r4r7is r%_is_palette_neededzGifImageFile._is_palette_needed`syq#a&&!$$  AFad::::aAh::::!AE(::::tt;ur$Nonecz|jJ|jd}t|sd}t||dd|jd<t |dt |df|_|d}|dzdz}|d zre|d |jd <|jd |z}||r#tj d |}|x|_ |_ |j|_ |j |_d|_|ddS)N znot a GIF fileversion r backgroundr9RGBr)r2r3r, SyntaxErrorinfoi16_sizer=rrawglobal_palettepalette_fptell_GifImageFile__rewind _n_frames_seek)r4r5msgflagsbitsr7rPs r%_openzGifImageFile._openfs(w""" GLL  qzz #"Cc"" " !u )AYYAq ) " Q 3; =&'eDIl # Q$Y''A&&q)) =&*5!445<<#dl7  %) 1 r$intc$|j|} ||dzd,#t$r|dz|_YnwxYw|||jS)NTr FrTrRrUEOFErrorseek)r4currents r%n_frameszGifImageFile.n_framess > !iikkG 17JJtyy{{Q6667 1 1 1!%q 1 IIg   ~s-A &A32A3c|j |jdkS|}|rdS |ddd}n#t$rd}YnwxYw|||S)Nr TFr\)r4r_ is_animateds r%rbzGifImageFile.is_animateds > %>Q& &))++  4 JJq% KK   KKK  'sA AAframecj||sdS||jkrd|_|d|j} t |jdz|dzD]}||dS#t $r,}||d}t ||d}~wwxYw)Nrr no more images in GIF file) _seek_check_GifImageFile__frame_imrUr:r]r^)r4rc last_frameferVs r%r^zGifImageFile.seeks&&  F 4<  DH JJqMMM\  '4._rgbas" -19q=3t':'B#C#CCCE#sC-($-5eai%!)a-6OPQQ ue,,r$rIr)rrHgif)rsrx)rrZr(r)8 isinstancerQrex_GifImageFile__offsetdisposergr^rSdisposal_methodrKtileload ValueErrorr2r6r3r]rLrRr+r;sizemaxrMr _decompression_bomb_checkr=rrNimpastedispose_extentrOr_frame_transparencyLOADING_STRATEGYrr"_moderPrmoder!putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillrh_cropAttributeErrorr _Tile)r4rcrlrVr5rPrKframe_transparency interlaceframe_dispose_extentblockrW dispose_bitsrox0y0x1y1rXr7rr dispose_size dispose_moderrks` r%rUzGifImageFile._seeksi dh . . (+  A::DM8 $  >SZZ1__qQ03E1 DIf-iikkiikkdGLLOOQC1IIBc!Qiic!QiiB1%%dil):): ):!$R1!6!6B ! 8M8M!MDJ3DJ???')2r2~$!"RZA- 3;(!AI?D Q$Y//A..q11("."25!"<"<"'w||Aq) $  AsY v  0C3--    F < = GMM$,(; < < <)0) >977+0L$(DKKE#(:??<u#U#UDLLx+'+zz$'4;N'O'O +7)-)<BB(*Rb'9 7 EEE'* 2977+1L$(D);$<$+F+F+H+HIIIII} "!5$)tw|:S:S*//$', BBK" N& &uMt/B/J/J/L/LMMMM   dgv '< = = =!DG " r$c4|jdkr|jdkrttjkrj|j(|j|jdd|_nd|_|j |jtj j |_dS|j sdS|j|j jkr|j&tjd|j}nhtjd|j}|dd|j| d}||j d|j jz||_ |j J|jg|jdkr!|jd|j}nU|j|jd|j d}n|j d}|jJ|||j}|j |_|jj|_|jdvr#|j||j|dS|j||jdS) NrrrrIrrLA)rr)rgrrrr"rrrrrr rrrrrrr getpaletterconvert_transparentrr)r4rframe_ims r%load_endzGifImageFile.load_endsF <1  yC$48R$R$R+7G++D,DaHHH!'DJJ!&DJ'//$)U\5PQQ F}  F 9 * * *'3#joofdi@@ #jooc49== &&ueTW5G5G5I5IJJJ)11%88   dmVdm6H-H I I I'DM=,,,  # /yC766tT=UVV''(@!DDD7??622wu--H"...::h(;<<-W\ =N * * GMM(D$7 B B B B B GMM(D$7 8 8 8 8 8r$c|jSN)rg)r4s r%rRzGifImageFile.tells |r$)r(r0)r7r'r(r))r(r>)r(rZ)r(r))rcrZr(r>)T)rcrZrlr)r(r>)rrrformatformat_description!_close_exclusive_fp_after_loadingrOr6r=rYpropertyr`rrbr^rUrrrR __classcell__)rs@r%r.r.Rs+ F)(-%N 6   X _"'''' C!C!C!C!C!J6(9(9(9(9Tr$r.rr)1rrr Image.Imagec|jtvr||Stj|jdkrx|dtjj}|jJ|jjdkr7|jj D]*}|ddkr|jj ||j d<n+|S|d S) a  Takes an image (or frame), returns an image in a mode that is appropriate for saving in a Gif. It may return the original image, or it may return an image converted to palette or 'L' mode. :param im: Image object :returns: Image object rIrrPNrr9rrr) rRAWMODErr getmodebaserPaletteADAPTIVErPcolorsrK)rrgbas r%_normalize_moders w'    !!U** ZZU]%;Z < <z%%% :?f $ $ )  7a<<.0j.?.EBGN+E  ::c??r$rP_Palette | NonerKdict[str, Any]cd}|rgt|tttfrt|dd}t|tjrt|j}|jdkr+|s(|d}|Jt|}nC|s&tdtdD}t jd||_|J|rg}|jJtdt|dD]V}t|||dz}|jj |}||vrd}| |Wt|D]1\}}|*tt|D] } | |vr| ||<n2g} |D]}|J| ||| }nat!||} | O|| |}d |vr3 | |d |d <n#t$$r|d =YnwxYw|S|jJ||j_|S) at Normalizes the palette for image. - Sets the palette to the incoming palette, if provided. - Ensures that there's a palette for L mode images - Optimizes the palette if necessary/desired. :param im: Image object :param palette: bytes object containing the source palette, or .... :param info: encoderinfo :returns: Image object Nirc3 K|] }|dzV dS)r9Nr#).0r<s r% z%_normalize_palette..>s&&B&B!qAv&B&B&B&B&B&Br$rIrrr9r)rr' bytearraylistrrPrrr:r;rrrappend enumerate remap_palette _get_optimizeindexr) rrPrKsource_palette im_paletteused_palette_colorsr< source_colorrjdest_mapoptimized_palette_colorss r%_normalize_paletter!sN8 gy$7 8 8 6&wtt}55N g|8 9 9 8&w77N w#~~ 3t,,J)))&z22N C&&B&BuSzz&B&B&BBBN!.unMMM  % % %02z%%%q#n--q11 . .A AE !:;;LJ%)),77E+++  & &u - - - -!"566  HAu}s#67788A 33312+A.4!( # #E$$$ OOE " " " "   h ' '#0T#:#: # /!!":NKKB%%-+C+I+I^,,,D(("---^,,,-I : ! ! !'BJ IsH.. H>=H>r2 IO[bytes]r>c vt|}|jD]5\}}t|tr|j||6t|||j}t||jD]}| |d}t|r|dz}t||d|dt|f|_ tj||tjdd|jzdt"|jg| ddS)Nrr~rrCr)rrKitemsrstr encoderinfo setdefaultr_get_global_headerwrite get_interlace_write_local_header encoderconfigr _saverrrr)rr2rPim_outrvr5rWs r%_write_single_framerhs6 R F !!##,,1 a   , N % %a + + +  @ @F  7 7   ER B...}R001F OY_UFRW,z_getbbox..s>=?RZ8bj !!!Sr$rr rF) alpha_only)rr subtract_modulogetbbox)rr palette_bytesdeltas r%_getbboxrsDKXCVMQ=+++##F++//&))  &x 9 9E %--5-11 11r$c.eZdZUded<ded<ded<dS)_Framerrz tuple[int, int, int, int] | NonebboxrrN)rrr__annotations__r#r$r%rrs3OOO****r$rc  |jd}|jd|jd}g}d}d}d}tj|g|jdgD]} t j| D]} t| } |dkrV| j D]<\} } | dkr t| tr|j | | =|j} d| jvr!| d| jdt| || } t|ttfr ||| d<n|d| jvr| jd| d<t|ttfr ||| d<|dz }d}|r|rt!|| \}}|s8| dr!|djdxx| dz cc<|djddkr|jd|jd}|v|\t#| |}t%jd | j|}|djj}|J|||jt!|| d}ntd | jz}nh| d rO| jd krCd| vr8| jJ | j| | d<n#t4$rYnwxYwd| vr| }t%jd |j| d}|jd kr4|\}}}}t9jd||||}ne|jd krCt%jd|j}|||}t9jd|}| |tCj"|nd}| }|#tI|p| || tK|dkr&d|jvr|djd|jd<dS|D]}|j} |j&s0tO| |jD]}|(|d }nH|s d|jd<|j&d | jzkr| )|j&} |j&dd}tU|| ||jdS)Nrsdisposalr append_imagesrr rnrrroptimizerrc |d|d|d|d|d|d|d|ddzdS) Nrrrgbarwrr#argss r%z(_write_multiple_frames..sv_T)_$/DK(3U ,7DKS 49,M,MtTWy)*)*)-S %&%& '* %*%( ." ."r$)rrrrrc8|d|ddzdS)Nrrrwrr#rs r%rz(_write_multiple_frames..s_T)_T$Z#=Ms-S-Sr$)r)maskFTinclude_color_table)+rrrK itertoolschainrIteratorrrrrrrrrrr_get_backgroundr newrrrPrr_new_color_indexrsplitr lambda_evalputdataget_flattened_datarrinvertrrr;r rrcrop_write_frame_data)rr2rPrsr  im_frames previous_im frame_count background_im imSequencerrrr diff_framerr rrH first_paletterrrrrrdelta_l frame_datar5offsets r%_write_multiple_framesr1s~!!*--H~!!*bgkk*.E.EFFH I&*KKMordBN,>,>PR,S,STT]P]P %.z::\ P\ PH&x}}77Ha$M//1188DAqN** !!S))811!Q777.--//K..&&~x}^7TUUU)(G[IIH(T5M22 D*2;*? J''!jHM&A&A*2- *C J'(T5M22 @*2;*? J' 1 KJC [C &{H== t"z22Y!" 1*===ZAXX===R=,00<<AAN..& N(C(CE((0)85)I)IJ,1Ic8=*,U,UM,5aLO,CM#0#<#<#<)44]MDVWWW' x@@C% 5 __Z00)KX]c5I5I%[88'/;;;! ( 0 A A( K K(77 *!!! D!%44%-]]__ $yej+n:UVV ://).JAq!Q#,#8 !" !"#$"#"#"#$$$DD" %zS00*/)C*D*D '0H0H0J0J K K K(/#,#8 S S#($$$D#((HOD4I4I(JJJ"K   VJ$:(D+NN O O O Oy\ P| 9~~  ' ')21)A*)MBN: &uHH = )'*2HII   FF E@D &'<=&8="888#==99_RaR(F"h 0FGGGG 4s?M M*)M*filename str | bytesc,t|||ddS)NT)save_all)r)rr2r2s r% _save_allr6s "b(T******r$r5cd|jvs d|jvr4|jd|jd}nd}|jdd|rt |||st ||||dt|dr|dSdS)NrPrTrpflush) rrKrrr1rrhasattrr8)rr2r2r5rPs r%rrsBN""i27&:&:.$$Y I0F0FGG !!*d333 -1"b'BB-BG,,,HHTNNNr7  r$rZcp|jdd}t|jdkrd}|S)Nrr r)rrminr)rrs r%rr0s9"";22I 27||b r$r0tuple[int, int]rWc2 |jd}n#t$rd}YnwxYwd|jvrt|jddz }nd}t|jdd}||dks|r|dnd}||dzz}|dt d zt d zt |zt |zt |pdzt dz|jd }|r*t|} t| } | r |d z}|| z}|d t |dzt |dzt |j dzt |j dzt |z|r$| r"|t| |t ddS)NrrsrDrr r rrqrrr}rrFr{rC) rKeyErrorrZrrro16_get_palette_bytes_get_color_table_sizer_get_header_palette) r2rr0rWrrsr  packed_flagrrcolor_table_sizes r%rr:sH~n5  R^##r~j1B6772>%%j!4455H8q==H='3aa x1}$   gg ee oo (mm   "##  $ ee     .,,-BCC-*2.. 0??  -CKE,,EHH fQi..  fQi..  bgaj//  bgaj//   U))  5/5 $]33444HHRUUOOOOOs  c"|} t|d5}|jdkr$tjd|g|tjndd|g}dg}tj|tjtj}tj||j|tj}|jJ|j | } | rtj | || } | rtj | |dddn #1swxYwY tj |dS#t$rYdSwxYw# tj |w#t$rYwwxYwxYw)NwbrIppmtogif)stdoutstderrppmquant256)stdinrIrJ)_dumpopenr subprocess check_callDEVNULLPopenPIPErIclosewaitCalledProcessErrorosunlinkOSError) rr2r2tempfilerj quant_cmd togif_cmd quant_proc togif_procretcodes r% _save_netpbmralsxxzzH$ (D ! ! LQw%%*1Z=O (9 'L '-joj>P (-$+%-  "(444!'')))$//++L$7KKK$//++L$7KKK= L L L L L L L L L L L L L L L@  Ih         DD   Ih        D seE'DD4( E'4D88E';D8<E'E E$#E$'F)E>=F> F F F  Flist[int] | Nonec|jdvr5|r2|dr|jdkr|jdkrtp |jdk}|s|j|jzdkrg}t |D]\}}|r|||s t|t|kr|S|j Jt|j j tj |j jz}d|dz z}t||dzkr|dkr|SdS) aL Palette optimization is a potentially expensive operation. This function determines if the palette should be optimized using some heuristics, then returns the list of palette entries in use. :param im: Image object :param info: encoderinfo :returns: list of indexes of palette entries in use, or None )rrrrriNr r)rrwidthheight_FORCE_OPTIMIZEr histogramrrr;rPr getmodebands bit_length)rrKoptimiserr<countnum_palette_colorscurrent_palette_sizes r%rrso :   HHZ   HMM INN#4bgn  +rx")+i77"$ %bllnn55 2 252'..q111 +3233s;N7O7OOO**:)))!$RZ%7!8!8E>BBr$ct|}d|zt|dzz }|dkr|tddz|zz }|S)z Returns the palette, null padded to the next power of 2 (*3) bytes suitable for direct inclusion in the GIF header :param palette_bytes: Unpadded palette bytes, in RGBRGB form :returns: Null padded palette rr9r)rBr;r)rrEactual_target_size_diffs r%rCrCs]-];; !$44M8J8Ja8OO""A%<<< r$c|jsdSt|jj|jjdkr>dfdt t dzDS)z Gets the palette for inclusion in the gif header :param im: Image object :returns: Bytes, len<=768 suitable for inclusion in gif header r$rc3>K|]}|dz|dzdzVdS)r}r9Nr#)rr<rPs r%rz%_get_palette_bytes..s9XX!71q51q519#45XXXXXXr$r9)rPr'rjoinr:r;)rrPs @r%rArAst :sBJ&''G z&  ((XXXXuS\\UVEV?W?WXXXXX Nr$info_background=int | tuple[int, int, int] | tuple[int, int, int, int] | Nonecd}|rft|trO|jJ |j||}n+#t$r}t |dvrYd}~n d}~wwxYw|}|S)Nr)z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)rrrPgetcolorrr)rrwrHrks r%rrsJ) ou - - ):))) Z00"EE    q66" )J sA A& A!!A& list[bytes]c d}|jddksE|rEd|vs?|d*|ds|drd}t||d }t|}t |}d |zt |jd zt |jd zt|d zt|td zt|g}|d~| dtdztdzdztdztd zt |dztd z|drdtdz}|d}t|tr| }td t|dD]1} || | dz} |tt| | zz }2|td z }| ||S)z2Return a list of strings representing a GIF headers87arBs89arrzNrsrorHsGIFrr rFrqrwrGryr9ru)rKrrrArBr@rrrCrrrencoder:r;) rrKrBrHrrEheader comment_blockror<subblocks r%rrs G w{{9'' ( d " "xx+xx ##,xx "",  TXXl%;%;<.Collectorr6rr(rZcT|j|t|Sr)r6rr;)r4r6s r%rz getdata..Collector.writes$ I  T " " "t99 r$N)r6rr(rZ)rrrr6rr#r$r% Collectorrs-      r$r)iorrr&r6)rr0rrrr2s r%rrsu&GGGIII Bb"ff--- 7Nr$z.gifz image/gif)r&r'r(r))rrr(r)rrrPrrKrr(r)rrr2rrPrr(r>)rrrrr(r)rrr2rrPrr(r))rrr2rr2r3r(r>)F) rrr2rr2r3r5r)r(r>)rrr(rZ) r2rrrr0r=rWrZr(r>)rrrKrr(rb)rr'r(rZ)rr'r(r')rrr(r')rrrwrxr(rZ)rrrKrr(r{) r2rrrr0r=rrr(r>)NN)rrrPrrKrr(r)r)rrr0r=rrr(r{)J __future__rrrorXrPenumr functoolsrtypingrrrr r r r rrr_binaryrrLrrr@_utilr TYPE_CHECKINGrrr_typingrrr rr,r.rrr'rrrZ_Paletterrrrr1r6rrrrarfrrBrCrArrr&rr register_openr register_saveregister_save_allregister_extension register_mimer#r$r%rs4#""""" %%%%%%(((((((((("!!!!!!!!!!!   """"""""g#2 5555hhhhh9&hhh^ #C ( (4 9 tCy (<+D DDDDDN8 2 2 2 2     Z   D++++ MR&////d----d3333lCCCC$     6;;;;|!!!!8UY'''''>06"""""PL'w???L'/// +Y777,f555L'55555r$