/ lib / PIL / GifImagePlugin.pyc
GifImagePlugin.pyc
  1  o

  2  Y��cЏ�@s�ddlZddlZddlZddlZddlmZddlmZmZm	Z	m
  3  Z
  4  mZddlm
ZddlmZddlmZGdd	�d	e�ZejZd
  5  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�
  6  ImageChops�	ImageFile�ImagePalette�
ImageSequence)�i16le)�o8)�o16lec@seZdZdZdZdZdZdS)�LoadingStrategyz.. versionadded:: 9.1.0rr�N)�__name__�
  7  __module__�__qualname__�__doc__�RGB_AFTER_FIRST� RGB_AFTER_DIFFERENT_PALETTE_ONLY�
  8  RGB_ALWAYS�rr��C:\Users\Jacks.GUTTSPC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\PIL\GifImagePlugin.pyr's
  9  rcCs|dd�dvS)N�)sGIF87asGIF89ar)�prefixrrr�_accept6�rcs~eZdZdZdZdZdZdd�Zdd�Zd	d
 10  �Z	e
 11  dd��Ze
 12  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�dataGszGifImageFile.datacCs\tdt|�d�D]#}|d||kr'||dkr'||dks+dSdSqdS)Nr�rr
TF)�range�len)r�p�irrr�_is_palette_neededMs4��zGifImageFile._is_palette_neededcCs�|j�d�}t|�sd}t|��|dd�|jd<t|d�t|d�f|_g|_|d}|d@d}|d	@rU|d
 13  |jd<|j�d|>�}|�|�rUt	�
 14  d
|�}||_|_|j|_
|j��|_d|_d|_|�d�dS)N�
znot a GIF filer�version��
 15  �r���
 16  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�_openSs(
 17  zGifImageFile._opencCs\|jdur+|��}z	|�|��dd�qty%|��d|_Ynw|�|�|jS)NTrF)r;r9r=�EOFError�seek�r�currentrrr�n_framesps
 18  ��
 19  zGifImageFile.n_framescCs~|jdur<|jdur|jdk|_|jS|��}|rd|_|jSz|�dd�d|_Wnty6d|_Ynw|�|�|jS)NrTF)r<r;r9r=rBrCrDrrr�is_animated|s 
 20  
 21  
�	�
 22  
 23  �
 24  zGifImageFile.is_animatedcCs�|�|�sdS||jkrd|_|�d�|j}t|jd|d�D]!}z|�|�Wq!tyB}z|�|�d}t|�|�d}~wwdS)Nrrzno more images in GIF file)�_seek_check�_GifImageFile__frame�imr=r"rBrC)r�frame�
 25  last_frame�f�er>rrrrC�s 
 26  
 27  
 28  
 29  
 30  ���zGifImageFile.seekTcs�|dkr!d�_d�_d�_�j��j�d�_d�jvr �jd=n	�jr*|r*��	�|�jdkr:d|��}t
 31  |���j�_�jrT�j��j����rQ	���sLd�_�j�
d�}|r`|dkrbt�d}i}d}d}d}		|su�j�
d�}|r{|dkr}�n:|dk�r#�j�
d�}���}
 32  |dd	kr�|
 33  d}|d@r�|
 34  d
 35  }t|
 36  d�d|d<d
|@}|d?}|r�|�_nb|ddkr�d}
|
 37  r�|
|
 38  7}
���}
 39  |
 40  s�d|vr�|dd|
7<n|
|d<d}ql|ddk�r|dk�r|
 41  �j��f|d<|
 42  dd�dk�r���}
 43  t|
 44  �d
 45  k�r|
 46  ddk�rt|
 47  d��jd<����r"	����sn�|dk�r��j�
d�}t|d�t|d�}}|t|d�|t|d�}}|�jdk�sX|�jdk�rr|�rrt|�jd�t|�jd�f�_t��j�||||f}	|d}|d@dk}|d@�r�|d@d}�j�
d
 48  |>�}��|��r�t�d|�}nd }�j�
d�d}�j���_n	d}qm|du�r�t�|�_|�s�dSg�_�j�rֈj��j�j�|du�r�|n�j�_|�_|dk�r�j�rt t!j"k�r�|du�r�d!nd�_#nd"�_#nd#�_#|�s�j�rdd$l$m$}|�j�}|�_%nA�j#d"k�r\t t!j&k�s*|�r\d�_'d%�jv�rO�j�(�jd%d��j�)d!tj*j+��_d!�_#�jd%=n
d�_#�j�)dtj*j+��_�fd&d'�}|	�_z��jdk�rpd�_n��jdk�rĈj\}}}}||||f}t�|�d"}�j�,d%|�}|du�r��j#d(v�r�d!}||�d)}n�j�,d*d�}�j#d(v�r�d}||�}tj-�.|||��_nD�jdu�rԈ�/�j�j��_n4|du�r�j\}}}}||||f}t�|�d"}|}�j#d(v�r�d!}||�d)}tj-�.|||��_Wn
 49  t0�yYnw|du�rId}|du�r9|dk�r1t t!j"k�r0|�jd%<n�j#d(v�r9|}d+||||f�j|||ffg�_|�,d��rV|d�jd<d,D]}||v�rh||�j|<�qX|�jv�rr�j|=�qXdS)-Nr������commentrzcannot seek to frame �;T�!��r!r*�duration�r
����
 50  ���	extensionr-�NETSCAPE2.0�loop�,�	�rr)�@r,r+r/F�RGBA�P�L)�copy�transparencycs8�jrt�jj|d|dd��}|S|||f}|S)Nr!)�_frame_palette�tupler7)�color�rrr�_rgbRs
 51   
 52  �z GifImageFile._seek.<locals>._rgb�r/ra)rr.�gif)rTrZ)1Z_GifImageFile__offset�disposerIr8rCr:Zdisposal_methodr1r4�load�
 53  ValueErrorrr rrBr2r9r#�size�maxr3r�_decompression_bomb_checkr&rr5rJ�paste�dispose_extentr6rf�_frame_transparency�LOADING_STRATEGYrr�moderdr7r�pyaccess�putpalettealpha�convert�Dither�FLOYDSTEINBERG�get�core�fill�_crop�AttributeError)rrKZupdate_imager>rr7r1Zframe_transparency�	interlaceZframe_dispose_extent�blockr?Zdispose_bitsrP�x0�y0�x1�y1r@r$rdrjZdispose_sizeZdispose_moderhre�krrirr=�sn
 54  �
 55  
 56  �
 57  ��
 58  
 59  ��
 60  &"
 61  �
 62  `
 63  
 64  �
 65  
 66  
 67  �
 68  
 69  ��
 70  
 71  
 72  
 73  �
 74  ��	
 75  ��zGifImageFile._seekcs�|jrdnd}d|_|jdkr |jdurtj�||j|j�|_n&|j	dvrF|j|_|jrCtj�d|j|jp6d�|_|jj
 76  |j���nd|_||_	d|_t��
�dS)Nrbrcrrk)rf�_prev_imrIrurr~rrprJrw�
 77  putpalette�getdata�super�load_prepare)rZ	temp_mode��	__class__rrr��s"
 78  
 79  
 80  ��
 81  zGifImageFile.load_preparecCs�|jdkr0|jdkr.ttjkr.|jdur |j�|jd�d|_nd|_|j�|jt	j
 82  j�|_dS|js5dS|jdurI|j�|jd�|j�d�}n|j�d�}|�
||j�}|j|_|jj|_|jdkro|j�||j|�dS|j�||j�dS)Nrrbrar/)rIrwrvrrrurJryrzrr{r|r�r�rtrs)rZframe_imrrr�load_end�s(
 83  
 84  
 85  
 86  
 87  zGifImageFile.load_endcCs|jS�N)rIrirrrr9�szGifImageFile.tell)T)rrr�format�format_description�!_close_exclusive_fp_after_loadingr6r r&rA�propertyrFrGrCr=r�r�r9�
__classcell__rrr�rr?s&
 88  
 89  
 90  rrcrb)�1rcrbcCs�|jtvr|��|St�|j�dkr?|jdtjjd�}|jjdkr=|jj	�
 91  �D]}|ddkr<|jj	||jd<|Sq(|S|�d�S)	a
 92      Takes an image (or frame), returns an image in a mode that is appropriate
 93      for saving in a Gif.
 94  
 95      It may return the original image, or it may return an image converted to
 96      palette or 'L' mode.
 97  
 98      :param im: Image object
 99      :returns: Image object
100      r/rb�r7rar!rrerc)rw�RAWMODErnr�getmodebaserz�Palette�ADAPTIVEr7�colors�keysr1)rJ�rgbarrr�_normalize_mode�s
101  �
102  r�c	CsXd}|rt|tttf�rt|dd��}t|tj�rt|j�}|jdkr1|s0|j�d�dd�}n|s>tdd�t	d�D��}tjd|d�|_|r�g}t	dt
103  |�d	�D]}t|||d	��}|jj�
|�}||vrkd}|�|�qRt|�D]\}}|dur�t	t
104  |��D]}||vr�|||<nq�qu|�|�}nt||�}|dur�|�||�S||j_|S)
105  at
106      Normalizes the palette for image.
107        - Sets the palette to the incoming palette, if provided.
108        - Ensures that there's a palette for L mode images
109        - Optimizes the palette if necessary/desired.
110  
111      :param im: Image object
112      :param palette: bytes object containing the source palette, or ....
113      :param info: encoderinfo
114      :returns: Image object
115      Nirbr/css�|]}|dVqdS)r!Nr)�.0r%rrr�	<genexpr>s�z%_normalize_palette.<locals>.<genexpr>r�rr!)�
116  isinstance�bytes�	bytearray�listrr7rwrJ�
117  getpaletter"r#rgr�r}�append�	enumerate�
remap_palette�
_get_optimize)	rJr7r1�source_palette�used_palette_colorsr%Zsource_color�index�jrrr�_normalize_palette�sF
118  
119  ���
120  r�c	Cs�t|�}|j��D]\}}|j�||�q	t|||j�}t||j�D]}|�|�q"d}t|�r4|dB}t	||d|�dt|�f|_
121  t�||dd|j
dt|jfg�|�d�dS)Nrr`�rrr)rl�)r�r1�items�encoderinfo�
122  setdefaultr��_get_global_header�write�
get_interlace�_write_local_header�
encoderconfigr�_saverpr�rw)rJrr7Zim_outr��vrr?rrr�_write_single_frame&s$r�cCsDt|�t|�krt�||�}|��St�|�d�|�d��}|��S)Nr/)�_get_palette_bytesr�subtract_modulorz�getbbox)�base_im�im_frame�deltarrr�_getbbox;s��r�c	Cs�|j�d�}|j�d|j�d��}g}d}d}t�|g|j�dg��D]�}t�|�D]�}	t|	���}	|dkrL|	j�	�D]\}
123  }|
124  dkrDq;|j�
125  |
126  |�q;|j��}t|	||�}	d|	jvre|�
127  d|	jd�t|t
tf�rs|||d<n|dur�d|	jvr�|	jd|d<t|t
tf�r�|||d<|d7}|r�|d}
t|
d|	�}|s�|�d�r�|
d	d|d7<q*|�d�d
128  kr�|dur�|j�d|j�dd��}t|	|�}t�d|	j|�}|�|ddj�t||	�}nd}|�|	||d
��q*q#t|�dk�rA|D]?}|d}	|d�st|	|d	�D]}|�|��qd}n|�s&d|d	d<|	�|d�}	|ddd
129  �}t||	||d	�q�dSd|jv�r^t|jdt
tf��r`t|jd�|jd<dSdSdS)NrT�disposalr�
append_imagesrerrOrJr�r
)rrrrb)rJ�bboxr�r�r�T�include_color_table)r�r}r1�	itertools�chainr�Iteratorr�rdr�r�r�r�r�rgr��_get_backgroundr�newrpr�r7r�r#r�r��crop�_write_frame_data�sum)rJrr7rTr��	im_frames�frame_countZ
background_im�
130  imSequencer�r�r�r��previousr�rhr.�
131  frame_datar�offsetrrr�_write_multiple_framesEs|
132  
133  
134  �
135  
136  ��+
137  ��r�cCst|||dd�dS)NT)�save_all)r�)rJr�filenamerrr�	_save_all�sr�FcCs�d|jvs
138  d|jvr|j�d|j�d��}nd}|j�dd�|jd<|r*t|||�s0t|||�|�d�t|d�r@|��dSdS)Nr7�optimizeTrQ�flush)r�r1r}r�r�r��hasattrr�)rJrr�r�r7rrrr��s
139  
140  �r�cCs$|j�dd�}t|j�dkrd}|S)Nr�r�r)r�r}�minrp)rJr�rrrr��sr�c
	Cs�d}zd|jvr|jd}n|jd}t|�}Wnttfy#Yn wd}t||j�}|durCz|�|�}WntyBd}Ynwd|jvrRt|jdd�}nd}t|j�dd��}|se|dkse|r�|ridnd}	|	|d	>O}	|sud}|�d
141  t	d�t	d�t	|	�t
142  |�t	|�t	d��|j�d
�}
143  |
144  r�t|�}t|�}|r�|dB}||B}|�dt
145  |d�t
146  |d�t
147  |j
d�t
148  |j
d�t	|��|
149  r�|r�|�t|��|�t	d��dS)NFreTrTr*rr�rr
rRrSr_r�r,r]r))r�r1�int�KeyErrorror�r�r}r�r
150  �o16r��_get_color_table_sizerp�_get_header_palette)
rrJr�r?Ztransparent_color_existsrer�rTr�Zpacked_flagr��
palette_bytes�color_table_sizerrrr��s�
151  
152  ��
153  �������
154  
155  �
156  �����r�c
157  Cs|��}ztt|d��S}|jdkrtjd|g|tjd�n:dd|g}dg}tj|tjtjd�}tj||j|tjd�}|j�	�|�
158  �}	|	rJt�|	|��|�
159  �}	|	rVt�|	|��Wd�n1s`wYWzt�
|�WdStyxYdSwzt�
|�Wwty�Yww)N�wbr/Zppmtogif)�stdout�stderrZppmquant�256)�stdinr�r�)�_dump�openrw�
160  subprocess�
161  check_call�DEVNULL�Popen�PIPEr��close�wait�CalledProcessError�os�unlink�OSError)
162  rJrr��tempfilerMZ	quant_cmdZ	togif_cmdZ
163  quant_procZ
164  togif_proc�retcoderrr�_save_netpbm�sL
165  �
166  
167  ��
168  ������r�cCs�|jdvra|rc|�dd�retp|jdk}|s|j|jdkrgg}t|���D]\}}|r1|�|�q&|s<t|�t	|�kr>|St	|j
169  j
170  �t�|j
171  j�}d|d�
�>}t	|�|dkri|dkrk|SdSdSdSdSdSdS)	aL
172      Palette optimization is a potentially expensive operation.
173  
174      This function determines if the palette should be optimized using
175      some heuristics, then returns the list of palette entries in use.
176  
177      :param im: Image object
178      :param info: encoderinfo
179      :returns: list of indexes of palette entries in use, or None
180      )rbrcr�rrcirr
N)rwr}�_FORCE_OPTIMIZE�width�heightr��	histogramr�rqr#r7r�getmodebands�
181  bit_length)rJr1Zoptimiser�r%�countZnum_palette_colorsZcurrent_palette_sizerrrr�'s*
182  ���r�cCs6|sdSt|�dkrdSt�t�t|�dd��dS)Nrr^rr!r
)r#�math�ceil�log)r�rrrr�Us
183  r�cCs<t|�}d|>t|�d}|dkr|td�d|7}|S)z�
184      Returns the palette, null padded to the next power of 2 (*3) bytes
185      suitable for direct inclusion in the GIF header
186  
187      :param palette_bytes: Unpadded palette bytes, in RGBRGB form
188      :returns: Null padded palette
189      r
r!r)r�r#r
190  )r�r�Zactual_target_size_diffrrrr�_s
191  r�cCs|jjS)z�
192      Gets the palette for inclusion in the gif header
193  
194      :param im: Image object
195      :returns: Bytes, len<=768 suitable for inclusion in gif header
196      r�)rJrrrr�qsr�c
197  Csdd}|r0t|t�r.z
198  |j�||�}W|Sty-}zt|�dvr"�WYd}~|Sd}~ww|}|S)Nr)z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r�rgr7�getcolorro�str)rJZinfo_backgroundr.rNrrrr�{s
199  �
200  �
201  ��
202  r�cCsrd}|j�d�dks|r d|vsd|vs|�d�s|�d�r d}t||�d��}t|�}t|�}d	|t|jd
203  �t|jd�t|d�t|�td
204  �t|�g}d|vrw|�	d
td�td�dtd�td�t|d�td
205  ��|�d�r�d
td�}|d}t
206  |t�r�|��}t
d
207  t|�d�D]}	||	|	d�}
208  |tt|
209  ��|
210  7}q�|td
211  �7}|�	|�|S)z2Return a list of strings representing a GIF headers87ar(s89arer\rTrPr.sGIFrrr,rRrYr-r[r!rV)r1r}r�r�r�r�rpr
212  r�r�r�r�encoder"r#)rJr1r(r.r�r��headerZ
comment_blockrPr%Zsubblockrrrr��sl������
213  �
�����
214  ���
215  
216  
217  
218  r�c	CsTz&||_t|||d�t�||dd|jdt|jfg�|�d�W|`dS|`w)Nrrlr�r�)r�r�rr�rpr�rwr�)rr�r��paramsrrrr��s�r�cCsdt||�}|duri}d|vrd|jvr|jd|d<t|||�}|j|_|j|_t||�}||fS)a
219      Legacy Method to get Gif data from image.
220  
221      Warning:: May modify image data.
222  
223      :param im: Image object
224      :param palette: bytes object containing the source palette, or ....
225      :param info: encoderinfo
226      :returns: tuple of(list of header items, optimized palette)
227  
228      Nr.)r�r1r�r7rJr�)rJr7r1r�Zim_modr	rrr�	getheader�s
229  
230  rr�cKs0Gdd�d�}|��|�}t||||�|jS)a�
231      Legacy Method
232  
233      Return a list of strings representing this image.
234      The first string is a local image header, the rest contains
235      encoded image data.
236  
237      To specify duration, add the time in milliseconds,
238      e.g. ``getdata(im_frame, duration=1000)``
239  
240      :param im: Image object
241      :param offset: Tuple of (x, y) pixels. Defaults to (0, 0)
242      :param \**params: e.g. duration or other encoder info parameters
243      :returns: List of bytes containing GIF encoded frame data
244  
245      c@seZdZgZdd�ZdS)zgetdata.<locals>.CollectorcSs|j�|�dSr�)r r�)rr rrrr�rz getdata.<locals>.Collector.writeN)rrrr r�rrrr�	Collectorsr)rnr�r )rJr�r
246  rrrrrr�s
247  r�z.gifz	image/gif)F)NN)r�)2r�rr�r��enumr�rrrrr�_binaryr	r2r
248  rr�rrrvrrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr��
register_openr��
register_save�register_save_all�register_extension�
register_mimerrrr�<module>sT		4
249  L
250  
251  B2.
252  
253  >
254  
255  $