3

h(                 @   s   d dl Z d dlZd dlZddlmZmZ G dd dZdd Zdd	 Zd
d Z	G dd dejZ
dd Zdd Zeje
je
e eje
je eje
jddddddg eje
jd dS )    N   )Image	ImageFilec               @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )	BoxReaderz}
    A small helper class to read fields stored in JPEG2000 header boxes
    and to easily step into and read sub-boxes.
    r   c             C   s    || _ |dk| _|| _d| _d S )Nr   r   )fp
has_lengthlengthremaining_in_box)selfr   r	    r   U/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/PIL/Jpeg2KImagePlugin.py__init__   s    
zBoxReader.__init__c             C   s:   | j r| jj | | jkrdS | jdkr2|| jkS dS d S )NFr   T)r   r   tellr	   r
   )r   	num_bytesr   r   r   	_can_read#   s
    

zBoxReader._can_readc             C   s`   | j |std| jj|}t||k rDtd| dt| d| jdkr\|  j|8  _|S )NzNot enough data in headerzExpected to read z bytes but only got .r   )r   SyntaxErrorr   readlenOSErrorr
   )r   r   datar   r   r   _read_bytes-   s    

zBoxReader._read_bytesc             C   s    t j|}| j|}t j||S )N)structcalcsizer   unpack)r   Zfield_formatsizer   r   r   r   read_fields;   s    

zBoxReader.read_fieldsc             C   s    | j }| j|}ttj||S )N)r
   r   r   ioBytesIO)r   r   r   r   r   r   
read_boxes@   s    
zBoxReader.read_boxesc             C   s$   | j r| jj | j | jk S dS d S )NT)r   r   r   r
   r	   )r   r   r   r   has_next_boxE   s    zBoxReader.has_next_boxc             C   s~   | j dkr| jj| j tj d| _ | jd\}}|dkrL| jdd }d}nd}||k sh| j||  rptd|| | _ |S )	Nr   r   z>I4sz>Q      zInvalid header lengthr   )r
   r   seekosSEEK_CURr   r   r   )r   ZlboxtboxZhlenr   r   r   next_box_typeK   s    

zBoxReader.next_box_typeNr   )r   )__name__
__module____qualname____doc__r   r   r   r   r    r!   r(   r   r   r   r   r      s   

r   c             C   s  | j d}tjd|d }|| j |d  }tjd|\}}}}}}}	}	}	}	}
dg|
 }dg|
 }dg|
 }x8t|
D ],}tjd|dd|  \||< ||< ||< qvW || || f}|
d	kr|d d
@ dkrd}nd}n0|
dkrd}n"|
dkrd}n|
dkrd}nd}||fS )zParse the JPEG 2000 codestream to extract the size and component
    count from the SIZ marker segment, returning a PIL (size, mode) tuple.   z>Hr   z>HHIIIIIIIIHNz>BBB$      r      r#   zI;16LLARGB   RGBA)r   r   r   unpack_fromrange)r   hdrZlsizZsizZrsizZxsizZysizZxosizZyosiz_ZcsizZssizZxrsizZyrsizir   moder   r   r   _parse_codestream`   s.    



,
r<   c             C   s$   |dkr d|  d|  d|  S dS )zConvert JPEG2000's (numerator, denominator, exponent-base-10) resolution,
    calculated as (num / denom) * 10^exp and stored in dots per meter,
    to floating-point dots per inch.r      
   i'  Nr   )numZdenomexpr   r   r   _res_to_dpi   s    rA   c             C   s  t | }d}d}xF|j rV|j }|dkr6|j }P q|dkr|jdd dkrd}qW d}d}d}d}d}	x
|j rx|j }|dkr|jd	\}
}}}||
f}|d
kr|d@ dkrd}n6|d
krd}n(|dkrd}n|dkrd}n|dkrd}qp|dkrp|j }xn|j rt|j }|dkr|jd\}}}}}}t|||}t|||}|dk	rn|dk	rn||f}	P qW qpW |dks|dkrtd||||	fS )zParse the JP2 header box to extract size, component count,
    color space information, and optionally DPI information,
    returning a (size, mode, mimetype, dpi) tuple.Ns   jp2hs   ftypz>4sr   s   jpx z	image/jpxs   ihdrz>IIHBr   r0   r#   zI;16r1   r-   r2   r/   r3   r4   r5   s   res s   rescz>HHHHBBzMalformed JP2 header)r   r!   r(   r    r   rA   r   )r   readerheadermimetyper'   r   r;   ZbpcZncdpiheightwidthresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresr   r   r   _parse_jp2_header   sZ    

rI   c                   sF   e Zd ZdZdZdd Ze fddZejdd Zdd	 Z	  Z
S )
Jpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)c             C   sd  | j jd}|dkr.d| _t| j \| _| _nV|| j jd }|dkr|d| _t| j }|\| _| _| _}|d k	r|| jd< nt	d| j
d ks| jd krt	d	d
| _d
| _d}d}y| j j }tj|j}W nj tk
r8   d}y4| j j }| j jd
tj | j j }| j j| W n tk
r2   d}Y nX Y nX dd| j
 d
| j| j| j||ffg| _d S )Nr4   s   OQj2kr#   s      jP  

jp2rE   znot a JPEG 2000 filezunable to determine size/moder   r   jpeg2kr   r   r   r   )r   r   )r   r   codecr<   _sizer;   rI   Zcustom_mimetypeinfor   r   _reducelayersfilenor%   fstatst_size	Exceptionr   r$   r   SEEK_ENDtile)r   sigrC   rE   fdr	   posr   r   r   _open   sD    



zJpeg2KImageFile._openc                s   | j pt jS )N)rQ   superreduce)r   )	__class__r   r   r^      s    zJpeg2KImageFile.reducec             C   s
   || _ d S )N)rQ   )r   valuer   r   r   r^     s    c             C   s   | j r| jrd| j> }|d? }t| jd | | t| jd | | f| _| j d }|d d | j| j|d d |d d f}|d d| j |d |fg| _ tjj| S )Nr   r   r/   r4   r-   )r   r   )rX   rQ   intr   rO   rR   r   load)r   poweradjusttt3r   r   r   rb     s    

*zJpeg2KImageFile.load)r)   r*   r+   formatformat_descriptionr\   propertyr^   setterrb   __classcell__r   r   )r_   r   rJ      s   0rJ   c             C   s    | d d dkp| d d dkS )Nr4   s   OQ   s      jP  

r   )prefixr   r   r   _accept  s    rn   c             C   sH  |j drd}nd}| j}|jdd }|jdd }|jdd }|jdd}|jd	d }	|	d k	rt|	ttfo|td
d |	D  rtd|jdd}
|jdd }|jdd }|jdd}|jdd}|jdd}d}t|dry|j	 }W n t
k
r   d}Y nX |||||	|
||||||f| _tj| |dd| j d|fg d S )Nz.j2krK   rL   offsettile_offset	tile_sizequality_modeZratesquality_layersc             S   s   g | ]}t |ttfqS r   )
isinstancera   float).0Zquality_layerr   r   r   
<listcomp>6  s   z_save.<locals>.<listcomp>z,quality_layers must be a sequence of numbersnum_resolutionsr   Zcodeblock_sizeprecinct_sizeirreversibleFprogressionZLRCPcinema_modenor   rS   rM   r   r   )r   r   )endswithZencoderinfogetrt   listtupleall
ValueErrorhasattrrS   rV   Zencoderconfigr   _saver   )Zimr   filenamekindrP   ro   rp   rq   rr   rs   rx   Z	cblk_sizery   rz   r{   r|   rZ   r   r   r   r   $  sP    

r   z.jp2z.j2kz.jpcz.jpfz.jpxz.j2cz	image/jp2)r   r%   r    r   r   r   r<   rA   rI   rJ   rn   r   Zregister_openrg   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s   I"?P=