
    ڧg2E                        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 	  e	d           n## eef$ rZ ed	e d
           Y dZ[ndZ[ww xY w G d de          Zdedej        fdZdedej        ddfdZej        dfdej        dededej        fdZd)dej        dedej        fdZd)dej        dedefdZej        ddfdeej        eej                 f         dedeeej        f         dedeej        eej                 f         f
dZ	 d*deej        eej                 f         d edeej        eej                 f         fd!Zd*dej        ded efd"Zej        dfdeej        ef         dededej        fd#Zej        dfdedededej        fd$Zdej        dej        fd%Z ej        fdej        dedej        fd&Z!ej        fdej        dedej        fd'Z"ej        fdej        dedej        fd(Z#dS )+    )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                   *    e Zd ZdZdZdZdZdZdZeZ	dS )ImageReadModea  Allow automatic conversion to RGB, RGBA, etc while decoding.

    .. note::

        You don't need to use this struct, you can just pass strings to all
        ``mode`` parameters, e.g. ``mode="RGB"``.

    The different available modes are the following.

    - UNCHANGED: loads the image as-is
    - RGB: converts to RGB
    - RGBA: converts to RGB with transparency (also aliased as RGB_ALPHA)
    - GRAY: converts to grayscale
    - GRAY_ALPHA: converts to grayscale with transparency

    .. note::

        Some decoders won't support all possible values, e.g. GRAY and
        GRAY_ALPHA are only supported for PNG and JPEG images.
    r      r         N)
__name__
__module____qualname____doc__	UNCHANGEDGRAY
GRAY_ALPHARGB	RGB_ALPHARGBA     P/var/www/html/ai-engine/env/lib/python3.11/site-packages/torchvision/io/image.pyr   r      s8         * IDJ
CIDDDr   r   pathreturnc                    t           j                                        s2t           j                                        st	          t
                     t           j        j                            t          |                     }|S )z
    Return the bytes contents of a file as a uint8 1D Tensor.

    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   datas     r   r$   r$   4   s_     9!!## 'EI,@,@,B,B 'I&&&9?$$SYY//DKr   filenamer'   c                 
   t           j                                        s2t           j                                        st	          t
                     t           j        j                            t          |           |           dS )z
    Write the content of an uint8 1D tensor 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'   s     r   r*   r*   D   sc     9!!## (EI,@,@,B,B (J'''	IOs8}}d33333r   Finputmodeapply_exif_orientationc                 d   t           j                                        s2t           j                                        st	          t
                     t          |t                    rt          |	                                         }t           j
        j                            | |j        |          }|S )a  
    Decodes a PNG image into a 3 dimensional RGB or grayscale Tensor.

    The values of the output tensor are in uint8 in [0, 255] for most cases. If
    the image is a 16-bit png, then the output tensor is uint16 in [0, 65535]
    (supported from torchvision ``0.21``). Since uint16 support is limited in
    pytorch, we recommend calling
    :func:`torchvision.transforms.v2.functional.to_dtype()` with ``scale=True``
    after this function to convert the decoded image into a uint8 or float
    tensor.

    Args:
        input (Tensor[1]): a one dimensional uint8 tensor containing
            the raw bytes of the PNG image.
        mode (str or ImageReadMode): The mode to convert the image to, e.g. "RGB".
            Default is "UNCHANGED".  See :class:`~torchvision.io.ImageReadMode`
            for 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])
    )r    r!   r"   r#   r	   
decode_png
isinstancer&   r   upperr%   r
   valuer+   r,   r-   outputs       r   r/   r/   Q   s    8 9!!## (EI,@,@,B,B (J'''$ +TZZ\\*Y_''tz;QRRFMr      compression_levelc                     t           j                                        s2t           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+   r6   r4   s      r   r8   r8   u   s\     9!!## (EI,@,@,B,B (J'''Y_''/@AAFMr   c                     t           j                                        s2t           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_pngr8   r*   )r+   r(   r6   r4   s       r   r:   r:      sc     9!!## 'EI,@,@,B,B 'I&&&011Fx     r   cpudevicec                    t           j                                        s2t           j                                        st	          t
                     t          |t                    rt          j        |          }t          t                    rt          
                                         t          | t                    rt          |           dk    rt          d          t          d | D                       st          d          t          d | D                       st          d          |j        dk    r+t           j        j                            | j        |          S fd| D             S | j        j        d	k    rt          d
          |j        dk    r2t           j        j                            | gj        |          d         S t           j        j                            | j                  S )a  Decode JPEG image(s) into 3D RGB or grayscale Tensor(s), on CPU or CUDA.

    The values of the output tensor are uint8 between 0 and 255.

    .. note::
        When using a CUDA device, passing a list of tensors is more efficient than repeated individual calls to ``decode_jpeg``.
        When using CPU the performance is equivalent.
        The CUDA version of this function has explicitly been designed with thread-safety in mind.
        This function does not return partial results in case of an error.

    Args:
        input (Tensor[1] or list[Tensor[1]]): a (list of) one dimensional uint8 tensor(s) containing
            the raw bytes of the JPEG image. The tensor(s) must be on CPU,
            regardless of the ``device`` parameter.
        mode (str or ImageReadMode): The mode to convert the image to, e.g. "RGB".
            Default is "UNCHANGED".  See :class:`~torchvision.io.ImageReadMode`
            for 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] or list[Tensor[image_channels, image_height, image_width]]):
            The values of the output tensor(s) are uint8 between 0 and 255.
            ``output.device`` will be set to the specified ``device``


    r   z,Input list must contain at least one elementc              3   J   K   | ]}t          |t          j                  V  d S )N)r0   r    Tensor.0ts     r   	<genexpr>zdecode_jpeg.<locals>.<genexpr>   s.      >>1:a..>>>>>>r   z/All elements of the input list must be tensors.c              3   6   K   | ]}|j         j        d k    V  dS )r;   N)r<   typer@   s     r   rC   zdecode_jpeg.<locals>.<genexpr>   s+      99a18=E)999999r   z'Input list must contain tensors on CPU.cudac                 f    g | ]-}t           j        j                            |j                  .S r   )r    r%   r
   decode_jpegr2   )rA   imgr-   r,   s     r   
<listcomp>zdecode_jpeg.<locals>.<listcomp>   s3    jjj]`EIO//TZAWXXjjjr   r;   z!Input tensor must be a CPU tensor)r    r!   r"   r#   r	   rH   r0   r&   r<   r   r1   listlen
ValueErrorallrE   r%   r
   decode_jpegs_cudar2   )r+   r,   r<   r-   s    ` `r   rH   rH      s   V 9!!## )EI,@,@,B,B )K(((&# &f%%$ +TZZ\\*% Zu::??KLLL>>>>>>> 	PNOOO99599999 	HFGGG;&  9?44UDJOOOjjjjjdijjjj <%%@AAA;&  9?44eWdj&QQRSTT9?..udjBXYYYr   K   qualityc                 z   t           j                                        s2t           j                                        st	          t
                     dk     sdk    rt          d          t          | t                    rZ| st          d          | d         j	        j
        dk    r%t           j        j                            |           S fd| D             S | j	        j
        dk    r,t           j        j                            | g          d         S t           j        j                            |           S )a  Encode RGB tensor(s) into raw encoded jpeg bytes, on CPU or CUDA.

    .. 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   rF   c                 Z    g | ]'}t           j        j                            |          (S r   )r    r%   r
   encode_jpeg)rA   r
   rQ   s     r   rJ   zencode_jpeg.<locals>.<listcomp>   s-    SSSEEIO//w??SSSr   )r    r!   r"   r#   r	   rU   rM   r0   rK   r<   rE   r%   r
   encode_jpegs_cuda)r+   rQ   s    `r   rU   rU      s   $ 9!!## )EI,@,@,B,B )K((({{gmmVWWW% ? 	ecddd8?6))9?44UGDDDSSSSUSSSS<&&9?44eWgFFqII9?..ug>>>r   c                    t           j                                        s2t           j                                        st	          t
                     t          | |          }t          |t           j                  sJ 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_jpegrU   r0   r?   r*   )r+   r(   rQ   r4   s       r   rX   rX     sz     9!!## (EI,@,@,B,B (J'''((Ffel+++++x     r   c                    t           j                                        s2t           j                                        st	          t
                     t          | t           j                  st          t          |                     } t          |t                    rt          |                                         }t           j        j                            | |j        |          }|S )a  Decode an image into a uint8 tensor, from a path or from raw encoded bytes.

    Currently supported image formats are jpeg, png, gif and webp.

    The values of the output tensor are in uint8 in [0, 255] for most cases.

    If the image is a 16-bit png, then the output tensor is uint16 in [0, 65535]
    (supported from torchvision ``0.21``). Since uint16 support is limited in
    pytorch, we recommend calling
    :func:`torchvision.transforms.v2.functional.to_dtype()` with ``scale=True``
    after this function to convert the decoded image into a uint8 or float
    tensor.

    Args:
        input (Tensor or str or ``pathlib.Path``): The image to decode. If a
            tensor is passed, it must be one dimensional uint8 tensor containing
            the raw bytes of the image. Otherwise, this must be a path to the image file.
        mode (str or ImageReadMode): The mode to convert the image to, e.g. "RGB".
            Default is "UNCHANGED".  See :class:`~torchvision.io.ImageReadMode`
            for available modes.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
           Only applies to JPEG and PNG images. Default: False.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    )r    r!   r"   r#   r	   decode_imager0   r?   r$   r&   r   r1   r%   r
   r2   r3   s       r   rZ   rZ     s    > 9!!## *EI,@,@,B,B *L)))eU\** &#e**%%$ +TZZ\\*Y_))%=STTFMr   c                     t           j                                        s2t           j                                        st	          t
                     t          |           }t          |||          S )z<[OBSOLETE] Use :func:`~torchvision.io.decode_image` instead.)r-   )r    r!   r"   r#   r	   
read_imager$   rZ   )r   r,   r-   r'   s       r   r\   r\   B  s^     9!!## (EI,@,@,B,B (J'''T??Dd;QRRRRr   c                     t           j                                        s2t           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+   s    r   r^   r^   N  sU     9!!## (EI,@,@,B,B (J'''9?%%e,,,r   c                 ^   t           j                                        s2t           j                                        st	          t
                     t          |t                    rt          |	                                         }t           j
        j                            | |j                  S )a'  
    Decode a WEBP image into a 3 dimensional RGB[A] Tensor.

    The values of the output tensor are uint8 between 0 and 255.

    Args:
        input (Tensor[1]): a one dimensional contiguous uint8 tensor containing
            the raw bytes of the WEBP image.
        mode (str or ImageReadMode): The mode to convert the image to, e.g. "RGB".
            Default is "UNCHANGED".  See :class:`~torchvision.io.ImageReadMode`
            for available modes.

    Returns:
        Decoded image (Tensor[image_channels, image_height, image_width])
    )r    r!   r"   r#   r	   decode_webpr0   r&   r   r1   r%   r
   r2   r+   r,   s     r   r`   r`   b  s}    & 9!!## )EI,@,@,B,B )K((($ +TZZ\\*9?&&udj999r   c                 ^   t           j                                        s2t           j                                        st	          t
                     t          |t                    rt          |	                                         }t           j
        j                            | |j                  S )a  
    Decode an AVIF image into a 3 dimensional RGB[A] Tensor.

    The values of the output tensor are in uint8 in [0, 255] for most images. If
    the image has a bit-depth of more than 8, then the output tensor is uint16
    in [0, 65535]. Since uint16 support is limited in pytorch, we recommend
    calling :func:`torchvision.transforms.v2.functional.to_dtype()` with
    ``scale=True`` after this function to convert the decoded image into a uint8
    or float tensor.

    Args:
        input (Tensor[1]): a one dimensional contiguous uint8 tensor containing
            the raw bytes of the AVIF image.
        mode (str or ImageReadMode): The mode to convert the image to, e.g. "RGB".
            Default is "UNCHANGED".  See :class:`~torchvision.io.ImageReadMode`
            for available modes.

    Returns:
        Decoded image (Tensor[image_channels, image_height, image_width])
    )r    r!   r"   r#   r	   _decode_avifr0   r&   r   r1   r%   r
   decode_avifr2   ra   s     r   rc   rc   |  s}    0 9!!## *EI,@,@,B,B *L)))$ +TZZ\\*9?&&udj999r   c                 ^   t           j                                        s2t           j                                        st	          t
                     t          |t                    rt          |	                                         }t           j
        j                            | |j                  S )a  
    Decode an HEIC image into a 3 dimensional RGB[A] Tensor.

    The values of the output tensor are in uint8 in [0, 255] for most images. If
    the image has a bit-depth of more than 8, then the output tensor is uint16
    in [0, 65535]. Since uint16 support is limited in pytorch, we recommend
    calling :func:`torchvision.transforms.v2.functional.to_dtype()` with
    ``scale=True`` after this function to convert the decoded image into a uint8
    or float tensor.

    Args:
        input (Tensor[1]): a one dimensional contiguous uint8 tensor containing
            the raw bytes of the HEIC image.
        mode (str or ImageReadMode): The mode to convert the image to, e.g. "RGB".
            Default is "UNCHANGED".  See :class:`~torchvision.io.ImageReadMode`
            for available modes.

    Returns:
        Decoded image (Tensor[image_channels, image_height, image_width])
    )r    r!   r"   r#   r	   _decode_heicr0   r&   r   r1   r%   r
   decode_heicr2   ra   s     r   rf   rf     s}    * 9!!## *EI,@,@,B,B *L)))$ +TZZ\\*9?&&udj999r   )r5   )rP   )$enumr   typingr   r   warningsr   r    	extensionr   utilsr	   ImportErrorOSErrorer   r&   r?   r$   r*   r   boolr/   intr8   r:   r<   rH   rU   rX   rZ   r\   r^   r`   rc   rf   r   r   r   <module>rr      s                        % % % % % % ' ' ' ' ' 'M'W   D	c1 	c 	c 	c           D   <C EL     
4 
4EL 
4T 
4 
4 
4 
4 (1#(! !<!
! !! \	! ! ! !H el s 5<    *! !U\ !S !S ! ! ! !( (1',#(	DZ DZtEL112DZ
DZ #u|#$DZ !	DZ
 5<el++,DZ DZ DZ DZP DF!? !?tEL112!?=@!?
5<el++,!? !? !? !?H! !el !c !C ! ! ! !( (1#(& &s"#&
& !& \	& & & &V (1#(	S 	S
	S
	S !	S \		S 	S 	S 	S-el -u| - - - -, (1: :<:
: \: : : :8 (1: :<:
: \: : : :> =J<S : : :M :X]Xd : : : : : :s   2 AAA