o
    oi                     @  s   d dl mZ d dlmZ d dlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlmZmZ d dlmZ d dlmZmZ G d	d
 d
eZd+ddZd,ddZd,ddZejdfd-ddZd.d"d#Zd/d$d%Zd/d&d'Zd0d1d)d*ZdS )2    )annotations)Enum)Path)AnyN)DeviceTensor)KORNIA_CHECK)image_to_tensortensor_to_imagec                   @  s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ImageLoadTypez'Enum to specify the desired image type.r                  N)
__name__
__module____qualname____doc__	UNCHANGEDGRAY8RGB8RGBA8GRAY32RGB32 r   r   @/home/ubuntu/.local/lib/python3.10/site-packages/kornia/io/io.pyr   !   s    r   	path_filer   devicer   returnr   c                 C  sf   | j  dv rtt| }ntt| }t|dd}t|tj	s&|du r(|nt	|}|j
|dS )aB  Read an image file and decode using the Kornia Rust backend.

    The decoded image is returned as numpy array with shape HxWxC.

    Args:
        path_file: Path to a valid image file.
        device: the device where you want to get your image placed.

    Return:
        Image tensor with shape :math:`(3,H,W)`.

    .jpg.jpegT)keepdimN)r   )suffixlower	kornia_rsread_image_jpegturbostrread_image_anyr	   
isinstancetorchr   to)r   r   imgimg_tdevr   r   r   _load_image_to_tensor,   s   "r0   imagec                 C  s   t | jtjk |  d S )z#Convert an image tensor to float32.     o@)r   dtyper+   uint8floatr1   r   r   r   _to_float32H   s   r7   c                 C  s   t | jtjk | d S )z!Convert an image tensor to uint8.r2   )r   r3   r+   float32mulbyter6   r   r   r   	_to_uint8N   s   r;   cpu
str | Pathdesired_typec           	      C  sP  t | ts	t| } t| |}|tjkr|S |tjkr\|jd dkr)|jtj	kr)|S |jd dkr>|jtj	kr>t
j|}|S |jd dkr[|jtj	kr[t
jt
jt|}t|S n|tjkr|jd dkrp|jtj	krp|S |jd dkr|jtj	krt
j|}|S n|tjkr|jd dkr|jtj	krt
jt|d}t|S n{|tjkr|jd dkr|jtj	krt|S |jd dkr|jtj	krt
jt|}|S |jd dkr|jtj	krt
jt
jt|}|S n2|tjkr!|jd dkr|jtj	krt|S |jd dkr!|jtj	kr!t
jt|}|S td| )aN  Read an image file and decode using the Kornia Rust backend.

    Args:
        path_file: Path to a valid image file.
        desired_type: the desired image type, defined by color space and dtype.
        device: the device where you want to get your image placed.

    Return:
        Image tensor with shape :math:`(3,H,W)`.

    r   r   r   r   g        zUnknown type: )r*   r   r0   r   r   r   shaper3   r+   r4   korniacolorrgb_to_grayscalergba_to_rgbr7   r;   r   grayscale_to_rgbr   rgb_to_rgbar   r   NotImplementedError)	r   r>   r   r1   gray8gray32rgb8rgba32rgb32r   r   r   
load_imageT   sX   






rL   img_npr   qualityintNonec                 C  s  | j  dv r)|jdks|jdkr|jd dkrdnd}tjt| |||d dS | j  d	krQ|jdksA|jdkrC|jd dkrCdnd}tjt| ||d
 dS | j  dkry|jdksi|jdkrk|jd dkrkdnd}tjt| ||d
 dS t	d| j  d)zWrite uint8 image to file.r    r   r   r   monorgb)moderN   .pngrT   .tiffUnsupported file extension: z for uint8 imageN)
r$   r%   ndimr?   r&   write_image_jpegr(   write_image_png_u8write_image_tiff_u8rF   )r   rM   rN   rT   r   r   r   _write_uint8_image   s   ***r]   c                 C  s   |j dks|j dkr|jd dkrdnd}| j dkr(tjt| ||d dS | j d	kr;tjt| ||d dS td
| j d)zWrite uint16 image to file.r   r   rQ   r   rR   rS   rU   rV   rW   rX   z for uint16 imageN)	rY   r?   r$   r%   r&   write_image_png_u16r(   write_image_tiff_u16rF   r   rM   rT   r   r   r   _write_uint16_image   s   *ra   c                 C  sb   |j dks|j dkr|jd dkrdnd}| j dkr(tjt| ||d dS td	| j d
)zWrite float32 image to file.r   r   rQ   r   rR   rS   rW   rV   rX   z for float32 imageN)rY   r?   r$   r%   r&   write_image_tiff_f32r(   rF   r`   r   r   r   _write_float32_image   s   *rc   P   c                 C  s   t | ts	t| } t| jdv d|  d t| dkd|j d t|ddd}|jdkr3|d	 }|jt	j
krAt| || dS |jt	jkrNt| | dS |jt	jkr[t| | dS td
|j )aM  Save an image file using the Kornia Rust backend.

    Args:
        path_file: Path to a valid image file.
        image: Image tensor with shape :math:`(3,H,W)`, `(1,H,W)` and `(H,W)`.
        quality: The quality of the JPEG encoding. If the file extension is .png or .tiff, the quality is ignored.

    Return:
        None.
    )r!   r"   rU   rW   zInvalid file extension: z1, only .jpg, .jpeg, .png and .tiff are supported.r   zInvalid image shape: z. Must be at least 2D.T)r#   force_contiguous).NzUnsupported image dtype: N)r*   r   r   r$   dimr?   r
   rY   r3   r+   r4   r]   uint16ra   r8   rc   rF   )r   r1   rN   rM   r   r   r   write_image   s"   


rh   )r   r   r   r   r   r   )r1   r   r   r   )r   r=   r>   r   r   r   r   r   )r   r   rM   r   rN   rO   r   rP   )r   r   rM   r   r   rP   )rd   )r   r=   r1   r   rN   rO   r   rP   )
__future__r   enumr   pathlibr   typingr   r&   r+   r@   kornia.corer   r   kornia.core.checkr   kornia.utilsr	   r
   r   r0   r7   r;   r   rL   r]   ra   rc   rh   r   r   r   r   <module>   s(   



@

	