U
    h1                  
   @   s  d dl mZ d dlmZmZ d dlmZ d dlZddlm	Z	 ddl
mZ ze	d W n6 eefk
r Z zed	e d
 W 5 dZ[X Y nX G dd deZeejdddZeejddddZejdfejeeejdddZd4ejeejdddZd5ejeedddZejddfejeeeejdd d!Zd6eejeej f eeejeej f d#d$d%Zd7ejeed&d'd(Zejdfejeeejdd)d*Zejdfeeeejd+d,d-Zejfeeejd.d/d0Zejejd1d2d3Z dS )8    )Enum)ListUnion)warnN   )_load_library)_log_api_usage_onceimagez(Failed to load image Python extension: 'z'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?c                   @   s$   e Zd ZdZdZdZdZdZdZdS )ImageReadModeaV  
    Support for various modes while reading images.

    Use ``ImageReadMode.UNCHANGED`` for loading the image as-is,
    ``ImageReadMode.GRAY`` for converting to grayscale,
    ``ImageReadMode.GRAY_ALPHA`` for grayscale with transparency,
    ``ImageReadMode.RGB`` for RGB and ``ImageReadMode.RGB_ALPHA`` for
    RGB with transparency.
    r      r         N)	__name__
__module____qualname____doc__	UNCHANGEDZGRAYZ
GRAY_ALPHARGBZ	RGB_ALPHA r   r   F/var/www/html/venv/lib/python3.8/site-packages/torchvision/io/image.pyr
      s   
r
   )pathreturnc                 C   s2   t j st j stt t jjt| }|S )z
    Reads and outputs the bytes contents of a file as a uint8 Tensor
    with one dimension.

    Args:
        path (str or ``pathlib.Path``): the path to the file to be read

    Returns:
        data (Tensor)
    )	torchjitis_scripting
is_tracingr   	read_fileopsr	   str)r   datar   r   r   r   (   s    r   )filenamer   r   c                 C   s4   t j st j stt t jjt| | dS )z
    Writes the contents of an uint8 tensor with one dimension to a
    file.

    Args:
        filename (str or ``pathlib.Path``): the path to the file to be written
        data (Tensor): the contents to be written to the output file
    N)	r   r   r   r   r   
write_filer   r	   r   )r    r   r   r   r   r!   9   s    	r!   F)inputmodeapply_exif_orientationr   c                 C   s6   t j st j stt t jj| |jd|}|S )a  
    Decodes a PNG image into a 3 dimensional RGB or grayscale Tensor.
    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 in [0, 255].

    Args:
        input (Tensor[1]): a one dimensional uint8 tensor containing
            the raw bytes of the PNG image.
        mode (ImageReadMode): the read mode used for optionally
            converting the image. Default: ``ImageReadMode.UNCHANGED``.
            See `ImageReadMode` class for more information on various
            available modes.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Default: False.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    F)	r   r   r   r   r   
decode_pngr   r	   valuer"   r#   r$   outputr   r   r   r%   G   s    r%      )r"   compression_levelr   c                 C   s0   t j st j stt t jj| |}|S )a	  
    Takes an input tensor in CHW layout and returns a buffer with the contents
    of its corresponding PNG file.

    Args:
        input (Tensor[channels, image_height, image_width]): int8 image tensor of
            ``c`` channels, where ``c`` must 3 or 1.
        compression_level (int): Compression factor for the resulting file, it must be a number
            between 0 and 9. Default: 6

    Returns:
        Tensor[1]: A one dimensional int8 tensor that contains the raw bytes of the
            PNG file.
    )r   r   r   r   r   
encode_pngr   r	   )r"   r*   r(   r   r   r   r+   d   s    r+   )r"   r    r*   c                 C   s4   t j st j stt t| |}t|| dS )a  
    Takes an input tensor in CHW layout (or HW in the case of grayscale images)
    and saves it in a PNG file.

    Args:
        input (Tensor[channels, image_height, image_width]): int8 image tensor of
            ``c`` channels, where ``c`` must be 1 or 3.
        filename (str or ``pathlib.Path``): Path to save the image.
        compression_level (int): Compression factor for the resulting file, it must be a number
            between 0 and 9. Default: 6
    N)r   r   r   r   r   	write_pngr+   r!   )r"   r    r*   r(   r   r   r   r,   y   s    
r,   cpu)r"   r#   devicer$   r   c                 C   s^   t j st j stt t |}|jdkrFt jj	
| |j|}nt jj	| |j|}|S )a  
    Decodes a JPEG image into a 3 dimensional RGB or grayscale Tensor.
    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 between 0 and 255.

    Args:
        input (Tensor[1]): a one dimensional uint8 tensor containing
            the raw bytes of the JPEG image. This tensor must be on CPU,
            regardless of the ``device`` parameter.
        mode (ImageReadMode): the read mode used for optionally
            converting the image. The supported modes are: ``ImageReadMode.UNCHANGED``,
            ``ImageReadMode.GRAY`` and ``ImageReadMode.RGB``
            Default: ``ImageReadMode.UNCHANGED``.
            See ``ImageReadMode`` class for more information on various
            available modes.
        device (str or torch.device): The device on which the decoded image will
            be stored. If a cuda device is specified, the image will be decoded
            with `nvjpeg <https://developer.nvidia.com/nvjpeg>`_. This is only
            supported for CUDA version >= 10.1

            .. betastatus:: device parameter

            .. warning::
                There is a memory leak in the nvjpeg library for CUDA versions < 11.6.
                Make sure to rely on CUDA 11.6 or above before using ``device="cuda"``.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Default: False. Only implemented for JPEG format on CPU.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    cuda)r   r   r   r   r   decode_jpegr.   typer   r	   Zdecode_jpeg_cudar&   )r"   r#   r.   r$   r(   r   r   r   r0      s    %

r0   K   )r"   qualityr   c                    s   t j st j stt  dk s, dkr4tdt| tr~| sJtd| d j	j
dkrjt jj|  S  fdd| D S n2| j	j
dkrt jj| g d S t jj|  S d	S )
a-  
    Takes a (list of) input tensor(s) in CHW layout and returns a (list of) buffer(s) with the contents
    of the corresponding JPEG file(s).

    .. note::
        Passing a list of CUDA tensors is more efficient than repeated individual calls to ``encode_jpeg``.
        For CPU tensors the performance is equivalent.

    Args:
        input (Tensor[channels, image_height, image_width] or List[Tensor[channels, image_height, image_width]]):
            (list of) uint8 image tensor(s) of ``c`` channels, where ``c`` must be 1 or 3
        quality (int): Quality of the resulting JPEG file(s). Must be a number between
            1 and 100. Default: 75

    Returns:
        output (Tensor[1] or list[Tensor[1]]): A (list of) one dimensional uint8 tensor(s) that contain the raw bytes of the JPEG file.
    r   d   z;Image quality should be a positive number between 1 and 100zDencode_jpeg requires at least one input tensor when a list is passedr   r/   c                    s   g | ]}t jj| qS r   )r   r   r	   encode_jpeg).0r	   r3   r   r   
<listcomp>   s     zencode_jpeg.<locals>.<listcomp>N)r   r   r   r   r   r5   
ValueError
isinstancelistr.   r1   r   r	   Zencode_jpegs_cuda)r"   r3   r   r7   r   r5      s    
r5   )r"   r    r3   c                 C   sD   t j st j stt t| |}t|t js6t	t
|| dS )a  
    Takes an input tensor in CHW layout and saves it in a JPEG file.

    Args:
        input (Tensor[channels, image_height, image_width]): int8 image tensor of ``c``
            channels, where ``c`` must be 1 or 3.
        filename (str or ``pathlib.Path``): Path to save the image.
        quality (int): Quality of the resulting JPEG file, it must be a number
            between 1 and 100. Default: 75
    N)r   r   r   r   r   
write_jpegr5   r:   TensorAssertionErrorr!   )r"   r    r3   r(   r   r   r   r<      s
    
r<   c                 C   s4   t j st j stt t jj| |j|}|S )a{  
    Detect whether an image is a JPEG, PNG or GIF and performs the appropriate
    operation to decode the image into a 3 dimensional RGB or grayscale Tensor.

    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 in [0, 255].

    Args:
        input (Tensor): a one dimensional uint8 tensor containing the raw bytes of the
            PNG or JPEG image.
        mode (ImageReadMode): the read mode used for optionally converting the image.
            Default: ``ImageReadMode.UNCHANGED``.
            See ``ImageReadMode`` class for more information on various
            available modes. Ignored for GIFs.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Ignored for GIFs. Default: False.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    )	r   r   r   r   r   decode_imager   r	   r&   r'   r   r   r   r?      s    r?   )r   r#   r$   r   c                 C   s2   t j st j stt t| }t|||dS )a  
    Reads a JPEG, PNG or GIF image into a 3 dimensional RGB or grayscale Tensor.
    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 in [0, 255].

    Args:
        path (str or ``pathlib.Path``): path of the JPEG, PNG or GIF image.
        mode (ImageReadMode): the read mode used for optionally converting the image.
            Default: ``ImageReadMode.UNCHANGED``.
            See ``ImageReadMode`` class for more information on various
            available modes. Ignored for GIFs.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Ignored for GIFs. Default: False.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    )r$   )r   r   r   r   r   
read_imager   r?   )r   r#   r$   r   r   r   r   r@     s    r@   )r   r#   r   c                 C   s   t | }tjj||jdS )NT)r   r   r   r	   r%   r&   )r   r#   r   r   r   r   _read_png_16-  s    rA   )r"   r   c                 C   s*   t j st j stt t jj| S )a&  
    Decode a GIF image into a 3 or 4 dimensional RGB Tensor.

    The values of the output tensor are uint8 between 0 and 255.
    The output tensor has shape ``(C, H, W)`` if there is only one image in the
    GIF, and ``(N, C, H, W)`` if there are ``N`` images.

    Args:
        input (Tensor[1]): a one dimensional contiguous uint8 tensor containing
            the raw bytes of the GIF image.

    Returns:
        output (Tensor[image_channels, image_height, image_width] or Tensor[num_images, image_channels, image_height, image_width])
    )r   r   r   r   r   
decode_gifr   r	   )r"   r   r   r   rB   2  s    rB   )r)   )r)   )r2   )r2   )!enumr   typingr   r   warningsr   r   	extensionr   utilsr   ImportErrorOSErrorer
   r   r=   r   r!   r   boolr%   intr+   r,   r0   r5   r<   r?   r@   rA   rB   r   r   r   r   <module>   sv   
0  &!