zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
U
T±d½ã@s–ddlZddlZddlZddlZddlmZddlmZmZm    Z    m
Z
m Z ddl m Zddl mZddl mZGdd    „d    eƒZejZd
d „ZGd d „d e    j    ƒZddddœZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd;dd„Zd d!„Zd"d#„Z d$d%„Z!dZ"d&d'„Z#d(d)„Z$d*d+„Z%d,d-„Z&d.d/„Z'd0d1„Z(d2d3„Z)d<d4d5„Z*d=d7d8„Z+e ,ej-ee¡e .ej-e¡e /ej-e¡e 0ej-d9¡e 1ej-d:¡dS)>éN)ÚIntEnumé)ÚImageÚ
ImageChopsÚ    ImageFileÚ ImagePaletteÚ ImageSequence)Úi16le)Úo8)Úo16lec@seZdZdZdZdZdZdS)ÚLoadingStrategyz.. versionadded:: 9.1.0rréN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚRGB_AFTER_FIRSTÚ RGB_AFTER_DIFFERENT_PALETTE_ONLYÚ
RGB_ALWAYS©rrúId:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\PIL/GifImagePlugin.pyr 'sr cCs|dd…dkS)Né)sGIF87asGIF89ar)ÚprefixrrrÚ_accept6srcs~eZdZdZdZdZdZdd„Zdd„Zd    d
„Z    e
d d „ƒZ e
d d„ƒZ dd„Z ddd„Z‡fdd„Zdd„Zdd„Z‡ZS)Ú GifImageFileZGIFzCompuserve GIFFNcCs,|j d¡}|r(|dr(|j |d¡SdS)Nrr)ÚfpÚread)ÚselfÚsrrrÚdataFs  zGifImageFile.datacCsXtdt|ƒdƒD]B}|d||krJ||dkrJ||dksndSqdS)Nrérr TF)ÚrangeÚlen)rÚpÚirrrÚ_is_palette_neededLs8zGifImageFile._is_palette_neededcCsØ|j d¡}t|ƒs d}t|ƒ‚|dd…|jd<t|dƒt|dƒf|_g|_|d}|d@d}|d    @rª|d
|jd <|j d |>¡}| |¡rªt     
d |¡}||_ |_ |j|_ |j ¡|_d|_d|_| d¡dS)Né znot a GIF filerÚversionéé
éré€é Ú
backgroundr ÚRGBr)rrrÚ SyntaxErrorÚinfoÚi16Ú_sizeÚtiler%rÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ    _n_framesÚ _is_animatedÚ_seek)rrÚmsgÚflagsÚbitsr#rrrÚ_openRs(  
   zGifImageFile._opencCs`|jdkrZ| ¡}z| | ¡dd¡qWn"tk
rN| ¡d|_YnX| |¡|jS)NrF)r:r8r<ÚEOFErrorÚseek©rÚcurrentrrrÚn_framesns
 
zGifImageFile.n_framescCsx|jdkrr|jdk    r"|jdk|_nP| ¡}|r6d|_n<z| dd¡d|_Wntk
rfd|_YnX| |¡|jS)NrTF)r;r:r8r<rArBrCrrrÚ is_animatedzs
 
 
 
zGifImageFile.is_animatedc Cs–| |¡sdS||jkr(d|_| d¡|j}t|jd|dƒD]N}z| |¡WqBtk
rŽ}z| |¡d}t|ƒ|‚W5d}~XYqBXqBdS)Nrrzno more images in GIF file)Z _seek_checkÚ_GifImageFile__frameÚimr<r!rArB)rÚframeZ
last_frameÚfÚer=rrrrBs
 
 
 
zGifImageFile.seekTcsô|dkrBdˆ_dˆ_dˆ_ˆj ˆj¡dˆ_dˆjkrTˆjd=nˆjrT|rTˆ     ¡|ˆjdkrtd|›}t
|ƒ‚ˆjˆ_ ˆjr ˆj  ˆj¡ˆ  ¡ršqdˆ_ˆj   d¡}|r¸|dkr¼t‚d}i}d}d}d}    |sàˆj   d¡}|rì|dkrôqrnx|dkrHˆj   d¡}ˆ  ¡}
|ddkrj|
d} | d@r:|
d    }t|
dƒd
|d <d | @} | d ?} | r6| ˆ_nÌ|ddkrÆd} |
r–| |
7} ˆ  ¡}
q|d|kr¶|dd| 7<n| |d<d}qÐnp|ddkr6|dkr6|
ˆj  ¡f|d<|
dd…dkr6ˆ  ¡}
t|
ƒd    kr6|
ddkr6t|
dƒˆjd<ˆ  ¡rlq6n$|dkrlˆj   d¡}t|dƒt|d ƒ}}|t|dƒ|t|dƒ}}|ˆjdks²|ˆjdkræ|ræt|ˆjdƒt|ˆjdƒfˆ_t ˆj¡||||f}    |d} | d@dk}| d@rJ| d@d}ˆj   d    |>¡}ˆ |¡rFt d|¡}nd}ˆj   d¡d}ˆj  ¡ˆ_qrnd}qÐ|dkr€t‚|ˆ_|sdSgˆ_ˆjr°ˆj ˆjˆj¡|dk    r¾|nˆjˆ_|ˆ_|dkr:ˆjrt t!j"kr|dk    rød ndˆ_#nd!ˆ_#nd"ˆ_#|s2ˆjr2dd#l$m$}|ˆjƒ}|ˆ_%n‚ˆj#d!kr¼t t!j&ksX|r¼dˆ_'d$ˆjkr¢ˆj (ˆjd$d¡ˆj )d tj*j+¡ˆ_d ˆ_#ˆjd$=ndˆ_#ˆj )dtj*j+¡ˆ_‡fd%d&„}|    ˆ_zJˆjd krèdˆ_n0ˆjd krˆj\}}}}||||f}t |¡d!}ˆj ,d$|¡}|dk    rVˆj#d'kr|d }||ƒd(}n&ˆj ,d)d¡}ˆj#d'kr|d}||ƒ}tj- .|||¡ˆ_nˆˆjdk    r°ˆ /ˆjˆj¡ˆ_nh|dk    rˆj\}}}}||||f}t |¡d!}|}ˆj#d'krd }||ƒd(}tj- .|||¡ˆ_Wnt0k
r0YnX|dk    rœd}|dk    r||dkrlt t!j"kr||ˆjd$<nˆj#d'kr||}d*||||fˆj|||ffgˆ_| ,d¡r¶|dˆjd<d+D]4}||krØ||ˆj|<n|ˆjkrºˆj|=qºdS),NréÿÿÿÿÚcommentrzcannot seek to frame ó;ó!éùr r)Údurationér éþóó
éÿÚ    extensionr,ó NETSCAPE2.0Úloopó,é    érr(é@r+r*r.FÚRGBAÚPÚL)ÚcopyÚ transparencycs6ˆjr(tˆjj|d|dd…ƒ}n
|||f}|S)Nr )Ú_frame_paletteÚtupler6)Úcolor©rrrÚ_rgbNs"
z GifImageFile._seek.<locals>._rgb©r.r^)rr-Úgif)rQrW)1Z_GifImageFile__offsetZdisposerGr7rBr9Zdisposal_methodr0r3ÚloadÚ
ValueErrorrrrrAr1r8r"ÚsizeÚmaxr2rZ_decompression_bomb_checkr%rr4rHÚpasteÚdispose_extentr5rcÚ_frame_transparencyÚLOADING_STRATEGYr rÚmoderar6rZpyaccessÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillÚ_cropÚAttributeError)rrIZ update_imager=rr6r0Zframe_transparencyÚ    interlaceZframe_dispose_extentÚblockr>Z dispose_bitsrMZx0Zy0Úx1Úy1r?r#rargZ dispose_sizeZ dispose_modererbÚkrrfrr<sR
 
 
 
 
 
 
 
 
 &"   
 
 
 
 ÿþ 
 
 
 
 
 
 
 
 
 
üÿ     
 zGifImageFile._seekcs¦|jr
dnd}d|_|jdkr@|jdk    rŒtj ||j|j¡|_nL|j    dkrŒ|j|_|jr†tj d|j|jpld¡|_|jj
|j  ¡Žnd|_||_    d|_t ƒ  ¡dS)Nr_r`rrh)rcÚ_prev_imrGrprrxryrlrHrrÚ
putpaletteÚgetdataÚsuperÚ load_prepare)rZ    temp_mode©Ú    __class__rrr…œs$
 
ÿ
zGifImageFile.load_preparecCsð|jdkr`|jdkr\ttjkr\|jdk    r@|j |jd¡d|_nd|_|j |jt    j
j ¡|_dS|j sjdS|jdk    r’|j |jd¡|j d¡}n |j d¡}|  ||j¡}|j |_|jj|_|jdkrÜ|j ||j|¡n|j ||j¡dS)Nrr_r^r.)rGrrrqr rrprHrsrtrrurvrrzrorn)rZframe_imrrrÚload_end°s(
 
 
 
 
zGifImageFile.load_endcCs|jS©N)rGrfrrrr8ÊszGifImageFile.tell)T)rrrÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr5rr%r@ÚpropertyrErFrBr<r…rˆr8Ú __classcell__rrr†rr?s$
 
 
 rr`r_)Ú1r`r_cCs‚|jtkr| ¡|St |j¡dkrx|jdtjjd}|jjdkrt|jj    D]&}|ddkrL|jj    ||j
d<qtqL|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
    r.r_©r6r^r rrbr`) rrÚRAWMODErjrZ getmodebasertZPaletteZADAPTIVEr6Úcolorsr0)rHZrgbarrrÚ_normalize_modeÕs
   r’c    Cs`d}|r>t|tttfƒr(t|dd…ƒ}t|tjƒr>t|jƒ}|jdkrb|sŒ|j d¡dd…}n*|s|tdd„t    dƒDƒƒ}tjd|d|_|r4g}t    dt
|ƒd    ƒD]<}t |||d    …ƒ}|jj   |¡}||krØd}| |¡q¦t|ƒD]:\}}|dkrìt    t
|ƒƒD]}||kr|||<qìqqì| |¡}n t||ƒ}|dk    rT| ||¡S||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
    Nir_r.css|]}|dVqdS)r Nr)Ú.0r$rrrÚ    <genexpr>sz%_normalize_palette.<locals>.<genexpr>rrr )Ú
isinstanceÚbytesÚ    bytearrayÚlistrr6rrrHZ
getpaletter!r"rdr‘rwÚappendÚ    enumerateZ remap_paletteÚ _get_optimize)    rHr6r0Zsource_paletteÚused_palette_colorsr$Z source_colorÚindexÚjrrrÚ_normalize_paletteîs@  
 
 
 
 
 
 rŸc    Cs¶t|ƒ}|j ¡D]\}}|j ||¡qt|||jƒ}t||jƒD]}| |¡qDd}t|ƒrh|dB}t    ||d|ƒdt|ƒf|_
t   ||dd|j dt|jfg¡| d¡dS)Nrr]©rrr(rió)r’r0ÚitemsÚ encoderinfoÚ
setdefaultrŸÚ_get_global_headerÚwriteÚ get_interlaceÚ_write_local_headerZ encoderconfigrÚ_saverlrrr)rHrr6Zim_outr€Úvrr>rrrÚ_write_single_frame"s $r«cCs>t|ƒt|ƒkrt ||¡}nt | d¡| d¡¡}| ¡S)Nr.)Ú_get_palette_bytesrZsubtract_modulortZgetbbox)Zbase_imÚim_frameÚdeltarrrÚ_getbbox7sÿr¯c    CsÐ|j d¡}|j d|j d¡¡}g}d}d}t |g|j dg¡¡D]´}t |¡D]¢}    t|     ¡ƒ}    |dkrœ|    j     ¡D] \}
} |
dkrŒqz|j 
|
| ¡qz|j ¡} t |    || ƒ}    d|    jkrÎ|  
d|    jd¡t |t tfƒrê||| d<n$|dkrd|    jkr|    jd| d<t |t tfƒr*||| d<|d7}|rä|d} t| d|    ƒ}|sx|  d¡rV| d    d| d7<qV|  d¡d
krè|dkrØ|j d|j dd ¡¡}t|    |ƒ}t d |    j|¡}| |ddj¡t||    ƒ}nd}| |    || d œ¡qVqFt|ƒdkr–|D]€}|d}    |dsLt|    |d    ƒD]}| |¡q4d}n0|s^d|d    d<|     |d¡}    |ddd
…}t||    ||d    ƒqdSd|jkrÌt |jdt tfƒrÌt|jdƒ|jd<dS)NrQÚdisposalrZ append_imagesrbrrLrHr£r )rrrr_)rHÚbboxr£r±r TÚinclude_color_table)r£rwr0Ú    itertoolsÚchainrÚIteratorr’rar¢r¤rŸr•r˜rdr¯Ú_get_backgroundrÚnewrlr‚r6r™r"r¥r¦ZcropÚ_write_frame_dataÚsum)rHrr6rQr°Z    im_framesZ frame_countZ background_imZ
imSequencer­r€rªr£Úpreviousr±rer-Z
frame_datarÚoffsetrrrÚ_write_multiple_framesAsz  
 
 
 
 ÿ
 
 ÿr¼cCst|||dddS)NT)Úsave_all)r©)rHrÚfilenamerrrÚ    _save_allŒsr¿FcCs€d|jksd|jkr,|j d|j d¡¡}nd}|j dd¡|jd<|rTt|||ƒs`t|||ƒ| d¡t|dƒr|| ¡dS)Nr6ÚoptimizeTrNÚflush)r£r0rwr¼r«r¦ÚhasattrrÁ)rHrr¾r½r6rrrr©s 
 
r©cCs$|j dd¡}t|jƒdkr d}|S)Nr|rér)r£rwÚminrl)rHr|rrrr§¡sr§c     CsÔd}z,d|jkr|jd}n
|jd}t|ƒ}Wnttfk
rHYnBXd}t||jƒ}|dk    rŠz| |¡}Wntk
rˆd}YnXd|jkr¨t|jddƒ}nd}t|j dd¡ƒ}|sÐ|dksÐ|r*|rØdnd}    |    |d    >O}    |sðd}| d
t    d ƒt    d ƒt    |    ƒt
|ƒt    |ƒt    dƒ¡|j d ¡}
|
rbt |ƒ} t | ƒ} | rb|dB}|| B}| dt
|dƒt
|dƒt
|j dƒt
|j dƒt    |ƒ¡|
rÂ| rÂ| t| ƒ¡| t    dƒ¡dS)NFrbTrQr)rr°rr rOrPr\r²r+rZr()r£r0ÚintÚKeyErrorrkr›rrwr¦r
Úo16r¬Ú_get_color_table_sizerlÚ_get_header_palette) rrHr»r>Ztransparent_color_existsrbrœrQr°Z packed_flagr²Ú palette_bytesÚcolor_table_sizerrrr¨«s|
 
 
 
  ÿþýüûúÿ
 
ÿ
þ ý üûÿ r¨c
Csä| ¡}z°t|dƒœ}|jdkr8tjd|g|tjdntdd|g}dg}tj    |tj
tjd}tj    ||j |tjd}|j   ¡|  ¡}    |    r”t |    |¡‚|  ¡}    |    r¬t |    |¡‚W5QRXW5zt |¡Wntk
rÜYnXXdS)NÚwbr.Zppmtogif)ÚstdoutÚstderrZppmquantZ256)ÚstdinrÍrÎ)Ú_dumpÚosÚunlinkÚOSErrorÚopenrrÚ
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErÍÚcloseÚwaitÚCalledProcessError)
rHrr¾ÚtempfilerJZ    quant_cmdZ    togif_cmdZ
quant_procZ
togif_procÚretcoderrrÚ _save_netpbmísB 
ÿ
ÿü
 rßcCsÆ|jdkrÂ|rÂ| dd¡rÂtp&|jdk}|s<|j|jdkrÂg}t| ¡ƒD]\}}|rL| |¡qL|sxt|ƒt    |ƒkr||St    |j
j
ƒt   |j
j¡}d|d  ¡>}t    |ƒ|dkrÂ|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
    )r_r`rÀrr`irr N)rrrwÚ_FORCE_OPTIMIZEÚwidthÚheightršZ    histogramr™rmr"r6rZ getmodebandsÚ
bit_length)rHr0Zoptimiserœr$ÚcountZnum_palette_colorsZcurrent_palette_sizerrrr›!s$   ÿþür›cCs:|sdSt|ƒdkrdSt t t|ƒdd¡¡dSdS)Nrr[rr r )r"ÚmathÚceilÚlog)rÊrrrrÈOs
 rÈcCs<t|ƒ}d|>t|ƒd}|dkr8|tdƒd|7}|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
    r r r)rÈr"r
)rÊrËZactual_target_size_diffrrrrÉYs
rÉcCs|jjS)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)rHrrrr¬ksr¬c
Cs`d}|r\t|tƒrXz|j ||¡}Wq\tk
rT}zt|ƒdkrD‚W5d}~XYq\Xn|}|S)Nr)z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r•rdr6ZgetcolorrkÚstr)rHZinfo_backgroundr-rKrrrr¶us
 r¶c Csxd}|j d¡dks<|r@d|ks<d|ks<| d¡s<| d¡r@d}t|| d¡ƒ}t|ƒ}t|ƒ}d    |t|jd
ƒt|jd ƒt|d ƒt|ƒtd
ƒt|ƒg}d|krî|     d tdƒtdƒdtdƒtd ƒt|dƒtd
ƒ¡| d¡rtd tdƒ}|d}t
|t ƒr"|  ¡}t d
t|ƒdƒD]*}    ||    |    d…}
|tt|
ƒƒ|
7}q2|td
ƒ7}|     |¡|S)z2Return a list of strings representing a GIF headers87ar's89arbrYrQrMr-sGIFrrr+rOrVr,rXr rS)r0rwr¶r¬rÈrÇrlr
rÉr™r•rèÚencoder!r") rHr0r'r-rÊrËÚheaderZ comment_blockrMr$Zsubblockrrrr¥Œspÿýüûú    ÿ þ ý
õ ÿþýüû
úùÿ
 
r¥c    CsRzF||_t|||dƒt ||dd|jdt|jfg¡| d¡W5|`XdS)Nrrir r¡)r£r¨rr©rlrrrr¦)rr­r»Úparamsrrrr¸Êsÿr¸cCsdt||ƒ}|dkri}d|kr6d|jkr6|jd|d<t|||ƒ}|j|_|j|_t||ƒ}||fS)a
    Legacy Method to get Gif data from image.
 
    Warning:: May modify image data.
 
    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: tuple of(list of header items, optimized palette)
 
    Nr-)r›r0rŸr6rHr¥)rHr6r0rœZim_modrêrrrÚ    getheaderÞs
 
rìr cKs0Gdd„dƒ}| ¡|ƒ}t||||ƒ|jS)aë
    Legacy Method
 
    Return a list of strings representing this image.
    The first string is a local image header, the rest contains
    encoded image data.
 
    To specify duration, add the time in milliseconds,
    e.g. ``getdata(im_frame, duration=1000)``
 
    :param im: Image object
    :param offset: Tuple of (x, y) pixels. Defaults to (0, 0)
    :param \**params: e.g. duration or other encoder info parameters
    :returns: List of bytes containing GIF encoded frame data
 
    c@seZdZgZdd„ZdS)zgetdata.<locals>.CollectorcSs|j |¡dSr‰)rr™)rrrrrr¦sz getdata.<locals>.Collector.writeN)rrrrr¦rrrrÚ    Collector srí)rjr¸r)rHr»rërírrrrrƒús
rƒz.gifz    image/gif)F)NN)r )2r³rårÑrÕÚenumrÚrrrrrÚ_binaryr    r1r
r rÇr rrqrrrr’rŸr«r¯r¼r¿r©r§r¨rßràr›rÈrÉr¬r¶r¥r¸rìrƒZ register_openrŠZ register_saveZregister_save_allZregister_extensionZ register_mimerrrrÚ<module>sR             4
K
 
B1.
 
>
 
$