o
    ʷ6iQ)                     @   s  d dl mZ d dlmZ zd dlmZmZmZmZm	Z	 W n e
y5   d dlZd dlZd dlZd dl	Z	Y nw eedr@ejjZnejZeedrQejjZejjZnejZejZdZdd	 Zd
d ZeejdeZdd Zdd ZG dd dejZG dd deZdS )    )BytesIO)
EngineBase)Image	ImageDraw	ImageFileImageFilter	ImageModeN
Resampling	Transposei  c                 C   s(   t | j}| j\}}|| t|j S )z Return the number of color values in the input image --
        this is the number of pixels times the band count
        of the image.
    )r   getmodemodesizelenbands)imagemode_descriptorwidthheight r   f/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/sorl/thumbnail/engines/pil_engine.pycolor_count   s   
r   c                    sJ   ddl m}m tt|   fdd|  D }|fdd|D  S )z0 Calculate the entropy of an images' histogram. r   )fsumlog2c                 3   s    | ]}|  V  qd S Nr   ).0histocol)histosumr   r   	<genexpr>)   s    z'histogram_entropy_py.<locals>.<genexpr>c                 3   s$    | ]}|d kr| | V  qdS )g        Nr   )r   p)r   r   r   r   *   s   " )mathr   r   floatr   	histogram)r   r   	histonormr   )r   r   r   histogram_entropy_py%   s   r#   entropyc                 C   sB   t d| | fd}t|}|jdd| d | d fdd|d |S )zDraw a round cornerLr           )fill)r   newr   Drawpieslice)radiusr)   cornerdrawr   r   r   round_corner2   s   
"r0   c                 C   s   | \}}t d| d}t|d}||d ||dd|| f ||d|| || f ||d|| df |S )zDraw a rounded rectangler%      )r   r   Z   r   r'   r(   )r   r*   r0   pasterotate)r   r-   r)   r   r   	rectangler.   r   r   r   round_rectangle:   s   

r6   c                   @   s"   e Zd Zd ZdddZdd ZdS )GaussianBlurr&   c                 C   s
   || _ d S r   )r-   )selfr-   r   r   r   __init__J      
zGaussianBlur.__init__c                 C   s   | | jS r   )gaussian_blurr-   r8   r   r   r   r   filterM   s   zGaussianBlur.filterN)r&   )__name__
__module____qualname__namer9   r=   r   r   r   r   r7   G   s    
r7   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZeeZdd Zdd Zdd Zdd  Zd!d" Zd'd%d&Zd#S )(Enginec                 C   s   t | }t|S r   )r   readr   open)r8   sourcebufferr   r   r   	get_imageR   s   
zEngine.get_imagec                 C   s   |j S r   )r   r<   r   r   r   get_image_sizeV   s   zEngine.get_image_sizec                 C   s
   |j pi S r   )infor<   r   r   r   get_image_infoY   r:   zEngine.get_image_infoc                 C   s6   t |}zt|}|  W dS  ty   Y dS w )NFT)r   r   rD   verify	Exception)r8   raw_datarF   trial_imager   r   r   is_valid_image\   s   

zEngine.is_valid_imagec                 C   s   |d }|d }|  |||S )z-
        Wrapper for ``_colorspace``
        
colorspaceformat)_colorspace)r8   r   geometryoptionsrP   rQ   r   r   r   rP   e   s   zEngine.colorspacec                 C   s   | ||||fS r   crop)r8   r   xyx2y2r   r   r   _cropboxn      zEngine._cropboxc                 C   s6   z|  }W n ty   d }Y nw |r|tS d S r   )_getexifrL   getEXIF_ORIENTATION)r8   r   exifr   r   r   _get_exif_orientationq   s   
zEngine._get_exif_orientationc                 C   s   |  |}|r`|dkr|t}|S |dkr|d}|S |dkr(|t}|S |dkr8|jdddt}|S |d	krE|jddd}|S |d
krU|jdddt}|S |dkr`|jddd}|S )Nr&      r'         i   )expand      r2      )ra   	transposeFLIP_LEFT_RIGHTr4   FLIP_TOP_BOTTOMr8   r   orientationr   r   r   _orientation|   s.   




zEngine._orientationc                 C   s   |  |}|o
|dv S )N)rd   rg   rh   ri   )ra   rm   r   r   r   _flip_dimensions   s   
zEngine._flip_dimensionsc                 C   s   |dkrF|j dkr|dkr|S |j dks"|j dkrAd|jv rA|dkrA|d}|jd}|d ur?|d d }|| |S |dS |dkrO|d	S |S )
NRGBRGBAJPEGLAPtransparencyGRAYr%   )r   rI   convertr^   splitputalpha)r8   r   rP   rQ   newimagerv   maskr   r   r   rR      s   




zEngine._colorspacec                 C   sf  dd dd dd dd d}ddddd}dD ]A}|| |d	 k rYt |d
 d}|| ||| |}|d|d ||d f}	| |	dk rP||  |7  < nn|| |d	 k s"qdD ]A}|| |d	 k rt |d
 d}|| ||| |}
||
d d|
d |f}	| |	dk r||  |7  < nn|| |d	 k sfq\||d |d ||d  ||d  fS )Nc                 S      ||| fS r   r   iydyrX   r   r   r   <lambda>       z'Engine._remove_border.<locals>.<lambda>c                 S      | | | | | fS r   r   ixdxrW   r   r   r   r          c                 S   r   r   r   r   r   r   r   r      r   c                 S   r~   r   r   r   r   r   r   r      r   )toprightbottomleftr   )r   r   g      @   
   re   g       @)r   r   r   r   r   r   )minrV   _get_image_entropy)r8   r   image_widthimage_heightbordersoffsetborder
slice_sizey_rangesectionx_ranger   r   r   _remove_border   s:   
	
zEngine._remove_borderc                 C   s4  || }|| |krNt || d}||| d||f}|dd||f}	| |	| |k r9||d||f}n|dd|| |f}||8 }|| |ks
|| |k rt|| d}
|d||
 ||f}|dd||
f}| || |k r|dd|||
 f}n	|d|
||f}||
8 }|| |k sT|S )Nr   r   )maxrV   r   r   )r8   r   geometry_widthgeometry_heightr   r   geometry_ratioslice_widthr   r   slice_heightr   r   r   r   r   _entropy_crop   s(   zEngine._entropy_cropc                 C   s   |j ||ftdS )N)resample)resize	ANTIALIAS)r8   r   r   r   r   r   r   _scale   r\   zEngine._scalec                 C   s   | |||| || fS r   rU   )r8   r   r   r   x_offsety_offsetr   r   r   _crop   s   zEngine._cropc                 C   s   t |j|d}|| |S )Nnotusedblack)r6   r   r{   )r8   r   rir   r   r   _rounded   s   
zEngine._roundedc                 C   s   | t|S r   )r=   r7   )r8   r   r-   r   r   r   _blur   s   zEngine._blurc           
      C   sd   |  |\}}t|d | d }t|d | d }|d}t|j||}	|	|||f |	S )Nr   r&   re   padding_color)rH   intr^   r   r*   r   r3   )
r8   r   rS   rT   x_imagey_imager   r   colorimr   r   r   _padding  s   
zEngine._paddingNFc           	      C   s   t tj|jd |jd  t_t }||dd}d|v r"|d |d< d }|dkr.|r.d|d< z;z|di  |j|fi | W n tyW   |d	 |j|fi | Y nw | }W |	  |S W |	  |S |	  w )
Nr   re   )rQ   qualityoptimizeicc_profilers   Tprogressiver`   r   )
r   r   MAXBLOCKr   r   popsaveOSErrorgetvalueclose)	r8   r   format_r   
image_infor   bfparamsrM   r   r   r   _get_raw_data  s2   


zEngine._get_raw_data)NF)r>   r?   r@   rG   rH   rJ   rO   rP   r[   ra   ro   rp   rR   r   r   staticmethodhistogram_entropyr   r   r   r   r   r   r   r   r   r   r   rB   Q   s(    		%$	rB   )ior   sorl.thumbnail.engines.baser   PILr   r   r   r   r   ImportErrorhasattrr	   LANCZOSr   r
   rk   rl   r_   r   r#   getattrr   r0   r6   Filterr7   rB   r   r   r   r   <module>   s4     






