o
    ir                     @   s  d Z ddlZddlZddlmZmZ erddlmZ zddlZdZ	W n e
y-   dZ	Y nw zddlmZmZ dZedZed	ZW n e
yS   dZdZdZY nw dd
lmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZmZmZm Z m!Z! e"dZ#eegZ$e e!gZ%e%e$ Z&dZ'dddZ(de)fddZ*dede)fddZ+ddde)fddZ,ddde)fddZ-d e.de/d!e/dd"fd#d$Z0d(d&d'Z1dS ))zVUse the `pillow <https://python-pillow.org/>`_ Python package
to decode *Pixel Data*.
    N)TYPE_CHECKINGcast)DatasetTF)Imagefeaturesjpgjpg_2000)config)generate_frames)warn_and_log)pixel_dtypeget_j2k_parametersget_nr_frames)UIDJPEG2000JPEG2000LosslessJPEGBaseline8BitJPEGExtended12BitpydicomPillow)zhttps://numpy.org/NumPy)zhttps://python-pillow.org/r   )numpyPILreturnc                   C   s   t otS )z8Return ``True`` if the handler has its dependencies met.)HAVE_NPHAVE_PIL r   r   `/mnt/sdb/aimis/docanh/lib/python3.10/site-packages/pydicom/pixel_data_handlers/pillow_handler.pyis_availableA   s   r   transfer_syntaxc                 C   s   | t v S )zReturn ``True`` if the handler supports the `transfer_syntax`.

    Parameters
    ----------
    transfer_syntax : uid.UID
        The Transfer Syntax UID of the *Pixel Data* that is to be used with
        the handler.
    )PillowSupportedTransferSyntaxes)r   r   r   r   supports_transfer_syntaxF   s   	r!   dsr   c                 C      dS )zReturn ``True`` if the *Pixel Data* should to be converted from YCbCr to
    RGB.

    This affects JPEG transfer syntaxes.
    Fr   r"   r   r   r   needs_to_convert_to_RGBR   s   r%   c                 C   r#   )zReturn ``True`` if the *Photometric Interpretation* should be changed
    to RGB.

    This affects JPEG transfer syntaxes.
    Fr   r$   r   r   r   .should_change_PhotometricInterpretation_to_RGB[   s   r&   dataphotometric_interpretationr   c                 C   s@   t | }t|}|tv r|dkrd|jvr|d|j |S )aX  Decompresses a single frame of an encapsulated Pixel Data element.

    Parameters
    ----------
    data: bytes
        Compressed pixel data
    transfer_syntax: str
        Transfer Syntax UID
    photometric_interpretation: str
        Photometric Interpretation

    Returns
    -------
    PIL.Image
        Decompressed pixel data

    RGBadobe_transformYCbCr)ioBytesIOr   openPillowJPEGTransferSyntaxesinfodraftsize)r'   r   r(   fioimager   r   r   _decompress_single_framee   s   

	
r5   numpy.ndarrayc                 C   sV  | j j}tstd|j dts|tv rtd|j dts-|t	v r-td|j d|t
krA| jdkrAtt
 dt
j dtt| j}tt| j}tt| j}tt| j}tt| j}t| d	d
}t }d\}	}
t| j|dD ]0}t|||}d|v r|d||f ||  |	st|}tt|d|}	|dd}
qstdt| d t !|t"| }|t	v r|| }|	r|	|krt#d| d|	 d t$j%r|	r||	 }|
s|
| j&krt '||}n4| j&dkr|t (d|d  8 }|rt '||}n| j&dkr|t (d|d  8 }|rt '||}t)| r&d| _td|S )a  Return a :class:`numpy.ndarray` of the *Pixel Data*.

    Parameters
    ----------
    ds : Dataset
        The :class:`Dataset` containing an Image Pixel module and the
        *Pixel Data* to be decompressed and returned.

    Returns
    -------
    numpy.ndarray
       The contents of (7FE0,0010) *Pixel Data* as a 1D array.

    Raises
    ------
    ImportError
        If Pillow is not available.
    NotImplementedError
        If the transfer syntax is not supported
    zKThe pillow package is required to use pixel_array for this transfer syntax z#, and pillow could not be imported.z$The pixel data with transfer syntax z5, cannot be read because Pillow lacks the JPEG pluginz:, cannot be read because Pillow lacks the JPEG 2000 plugin   z - z> is only supported by Pillow if (0028,0100) Bits Allocated = 8F)warn)NN)number_of_framesYBRr+   	precision	is_signedNzSuccessfully read z pixel bytesz%The (0028,0101) 'Bits Stored' value (z(-bit) doesn't match the JPEG 2000 data (z?-bit). It's recommended that you change the 'Bits Stored' value      r)   r6   )*	file_metaTransferSyntaxUIDr   ImportErrorname	HAVE_JPEGr/   NotImplementedErrorHAVE_JPEG2KPillowJPEG2000TransferSyntaxesr   BitsAllocatedr   strPhotometricInterpretationintRowsColumns
BitsStoredr   	bytearrayr
   	PixelDatar5   r1   extendtobytesr   
setdefaultloggerdebuglenr   
frombufferr   r   r	   APPLY_J2K_CORRECTIONSPixelRepresentationright_shiftuint32r&   )r"   r   r(   rowscolumnsbits_storedbits_allocated	nr_framespixel_bytesj2k_precisionj2k_signframeimparamsarrshiftr   r   r   get_pixeldata   s   



rh   )r"   r   r   r6   )2__doc__r,   loggingtypingr   r   pydicom.datasetr   r   r   rA   r   r   r   r   check_codecrC   rE   r   r	   pydicom.encapsr
   pydicom.miscr   pydicom.pixels.utilsr   r   r   pydicom.uidr   r   r   r   r   	getLoggerrS   rF   r/   r    HANDLER_NAMEDEPENDENCIESboolr   r!   r%   r&   bytesrH   r5   rh   r   r   r   r   <module>   sd   

		

&