o
    i                     @   s   d dl mZ d dlmZ d dlZd dlZd dlmZ d dlm	Z	 ddl
mZmZ dd	lmZmZ G d
d deej ZG dd deej ZdS )    )BytesIO)PathN)Imagetensor2base64   )convert_image_modergba_to_rgb   )MediaIOMediaWithBytesc                       s   e Zd Zddeddf fddZdejeej B dejfdd	Zd
edeej fddZ	ded
edeej fddZ
dedeej fddZdddejdedefddZ  ZS )ImageMediaIORGB
image_modereturnNc                    sn   t    || _|| _|dd}t|trt|}t|tr.t|dkr.t	dd |D s2t
d|| _d S )Nrgba_background_color)   r   r      c                 s   s2    | ]}t |tod |  kodkn  V  qdS )r   r   N)
isinstanceint).0c r   Q/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/multimodal/media/image.py	<genexpr>(   s   0 z(ImageMediaIO.__init__.<locals>.<genexpr>zRrgba_background_color must be a list or tuple of 3 integers in the range [0, 255].)super__init__r   kwargsgetr   listtuplelenall
ValueErrorr   )selfr   r   rgba_bg	__class__r   r   r      s   


zImageMediaIO.__init__imagec                 C   sL   t |tr|j}|j| jkr|S |jdkr | jdkr t|| jS t|| jS )z0Convert image mode with custom background color.RGBAr   )r   r   mediamoder   r	   r   r   )r$   r(   r   r   r   _convert_image_mode0   s   
z ImageMediaIO._convert_image_modedatac                 C   s   t t|}t| ||S N)r   openr   r   r,   )r$   r-   r(   r   r   r   
load_bytes=   s   zImageMediaIO.load_bytes
media_typec                 C      |  tj|ddS NT)validater0   pybase64	b64decoder$   r1   r-   r   r   r   load_base64A      zImageMediaIO.load_base64filepathc                 C   sP   t |d}| }W d    n1 sw   Y  t t|}t| ||S )Nrb)r/   readr   r   r   r,   )r$   r;   fr-   r(   r   r   r   	load_fileD   s
   
zImageMediaIO.load_filePNG)image_formatr*   rA   c                C   sX   |}t  }| |}||| | }W d    n1 sw   Y  t|dS )Nzutf-8)r   r,   savegetvaluer6   	b64encodedecode)r$   r*   rA   r(   bufferr-   r   r   r   encode_base64J   s   

zImageMediaIO.encode_base64)r   )__name__
__module____qualname__strr   r   r   r,   bytesr0   r9   r   r?   rG   __classcell__r   r   r&   r   r      s$    

r   c                       sr   e Zd Zd fddZdedejfddZdededejfd	d
Z	de
dejfddZdejdefddZ  ZS )ImageEmbeddingMediaIOr   Nc                    s   t    d S r.   )r   r   )r$   r&   r   r   r   [   s   zImageEmbeddingMediaIO.__init__r-   c                 C   sL   t |}tj  tj|dd}| W  d    S 1 sw   Y  d S NT)weights_only)r   torchsparsecheck_sparse_tensor_invariantsloadto_dense)r$   r-   rF   tensorr   r   r   r0   ^   s
   $z ImageEmbeddingMediaIO.load_bytesr1   c                 C   r2   r3   r5   r8   r   r   r   r9   f   r:   z!ImageEmbeddingMediaIO.load_base64r;   c                 C   sD   t j  t j|dd}| W  d    S 1 sw   Y  d S rO   )rQ   rR   rS   rT   rU   )r$   r;   rV   r   r   r   r?   i   s   $zImageEmbeddingMediaIO.load_filer*   c                 C   s   t |S r.   r   )r$   r*   r   r   r   rG   p   s   z#ImageEmbeddingMediaIO.encode_base64)r   N)rH   rI   rJ   r   rL   rQ   Tensorr0   rK   r9   r   r?   rG   rM   r   r   r&   r   rN   Z   s    rN   )ior   pathlibr   r6   rQ   PILr   vllm.utils.serial_utilsr   r(   r   r	   baser   r   r   rW   rN   r   r   r   r   <module>   s   I