B
    zb$              	   @   s  d dl Z d dlZd dlZd dlmZmZ dd Zddddd	d
gZdd Zdd Z	G dd dejZ
d&ddZdd Zdd Zdd Zee
je
 ee
je edkreejdk red e  ejd Ze	esed e  eeZedee  edeej  edeej  ed eej  ed!d"d# ee  eejdkrejd Zeej j!Zed$e j"#e d%e d" e$ee
j W dQ R X dS )'    N)Image	ImageFilec          	   C   s>   y t | }| | dkrdS dS W n ttfk
r8   dS X d S )Nr      )int
ValueErrorOverflowError)fi r
   4lib/python3.7/site-packages/PIL/SpiderImagePlugin.pyisInt*   s    r   r      iiiic             C   sv   d|  }xdD ]}t || sdS qW t|d }|tkr>dS t|d }t|d }t|d }||| krrdS |S )N)c   )r                     r   r   r   r   r   )r   r   iforms)thr	   iformlabreclabbytlenbytr
   r
   r   isSpiderHeader>   s    
r   c          	   C   sT   t | d}|d}W d Q R X td|}t|}|dkrPtd|}t|}|S )Nrb\   z>23fr   z<23f)openreadstructunpackr   )filenamefpr   r   hdrlenr
   r
   r   isSpiderImageR   s    r&   c               @   sZ   e Zd ZdZdZdZdd Zedd Zedd	 Z	d
d Z
dd ZdddZdd ZdS )SpiderImageFileZSPIDERzSpider 2D imageFc       	   
   C   s  d}| j |}yPd| _td|}t|}|dkrNd| _td|}t|}|dkr^tdW n. tjk
r } ztd|W d d }~X Y nX d| }t|d }|dkrtd	t|d
 t|d f| _	t|d | _
t|d | _| j
dkr| jdkr|}d| _n| j
dkrh| jdkrht|d
 t|d  d | _|| _t|d | _|d }d| _n2| j
dkr| jdkr|| j }d| _
ntd| jrd| _nd| _d| _dd| j || jddffg| _| j | _d S )Nl   r   z>27fr   z<27fznot a valid Spider file)r   r   znot a Spider 2D imager   r               z inconsistent stack header valueszF;32BFzF;32FFraw)r   r   )r$   r    Z	bigendianr!   r"   r   SyntaxErrorerrorr   Z_sizeistack	imgnumber_nimagesimgbytesr%   	stkoffsetrawmodemodesizeZtile_fp)	selfnr   r   r%   er   r   offsetr
   r
   r   _openc   sP    
zSpiderImageFile._openc             C   s   | j S )N)r3   )r:   r
   r
   r   n_frames   s    zSpiderImageFile.n_framesc             C   s
   | j dkS )Nr   )r3   )r:   r
   r
   r   is_animated   s    zSpiderImageFile.is_animatedc             C   s   | j dk rdS | j d S d S )Nr   r   )r2   )r:   r
   r
   r   tell   s    
zSpiderImageFile.tellc             C   sZ   | j dkrtd| |s d S | j|| j| j   | _| j| _| j| j | 	  d S )Nr   z#attempt to seek in a non-stack file)
r1   EOFErrorZ_seek_checkr%   r4   r5   r9   r$   seekr>   )r:   framer
   r
   r   rC      s    

zSpiderImageFile.seek   c             C   sH   |   \}}d}||kr$|||  }| | }| ||fdddS )Nr   c             S   s   | | | S )Nr
   )r	   mbr
   r
   r   <lambda>       z.SpiderImageFile.convert2byte.<locals>.<lambda>L)
getextremaZpointconvert)r:   ZdepthZminimumZmaximumrF   rG   r
   r
   r   convert2byte   s    
zSpiderImageFile.convert2bytec             C   s   ddl m} |j|  ddS )Nr   )ImageTk   )Zpalette)PILrN   Z
PhotoImagerM   )r:   rN   r
   r
   r   tkPhotoImage   s    zSpiderImageFile.tkPhotoImageN)rE   )__name__
__module____qualname__formatZformat_descriptionZ!_close_exclusive_fp_after_loadingr>   propertyr?   r@   rA   rC   rM   rQ   r
   r
   r
   r   r'   ]   s   7
	r'   c          
   C   s   | dkst | dk rdS g }x| D ]}tj|sBtd|  q"y"t|}| }W dQ R X W n* tk
r   t	|st|d  w"Y nX ||j
d< || q"W |S )zJcreate a list of :py:class:`~PIL.Image.Image` objects for use in a montageNr   zunable to find z is not a Spider image filer#   )lenospathexistsprintr   r   rM   	Exceptionr&   infoappend)ZfilelistZimglistZimgimr
   r
   r   loadImageSeries   s"    

r`   c       	      C   s   | j \}}|d }td| }d| dkr2|d7 }|| }t|d }|dk rRg S g }xt|D ]}|d q`W d|d< t||d< t||d	< d|d
< t||d< t||d< t||d< t||d< |dd  }|d dd |D S )Nr+   i   r   r   r   g        g      ?r   r   r   r   r   r   c             S   s   g | ]}t d |qS )r   )r!   Zpack).0vr
   r
   r   
<listcomp>   s    z$makeSpiderHeader.<locals>.<listcomp>)r8   r   ranger^   float)	r_   ZnsamZnrowr   r   r   Znvalueshdrr	   r
   r
   r   makeSpiderHeader   s.    

rg   c          
   C   sj   | j d dkr| d} t| }t|dk r4td|| d}t| |dd| j d|ddffg d S )	Nr   r-   rO   zError creating Spider headerzF;32NFr.   )r   r   r   )	r7   rL   rg   rW   OSError
writelinesr   _saver8   )r_   r$   r#   rf   r6   r
   r
   r   rj     s    

rj   c             C   s.   t j|d }ttj| t| || d S )Nr   )rX   rY   splitextr   Zregister_extensionr'   rU   rj   )r_   r$   r#   Zextr
   r
   r   _save_spider  s    rl   __main__r   z7Syntax: python3 SpiderImagePlugin.py [infile] [outfile]z$input image must be in Spider formatzimage: zformat: zsize: zmode: z
max, min:  )endzsaving a flipped version of z as )N)%rX   r!   sysrP   r   r   r   r   r   r&   r'   r`   rg   rj   rl   Zregister_openrU   Zregister_saverR   rW   argvr[   exitr#   r   r_   strr8   r7   rK   ZoutfileZ	transposeZ	TransposeZFLIP_LEFT_RIGHTrY   basenameZsaver
   r
   r
   r   <module>#   sF   	j
 



