a :jg*#@sddlmZddlZddlmZddlmZmZddlm Z m Z m Z m Z erXddlm Z Gdd d Zd d d d d dZddddddZdddddZd(d d dddZd)d d dddZd*d d dd d!Zd+d d dd"d#Zd d$d%d&d'ZdS),) annotationsN)Sequence)IO TYPE_CHECKING)GimpGradientFileGimpPaletteFile ImageColor PaletteFile)Imagec@seZdZdZd+dddddd Zed d d d Zejd dddd Zedd ddZejdddddZdd ddZ dd ddZ dd ddZ e Z d,dddd d!d"Z d-d#ddd$d%d&Zd'dd(d)d*ZdS). ImagePalettea Color palette for palette mapped images :param mode: The mode to use for the palette. See: :ref:`concept-modes`. Defaults to "RGB" :param palette: An optional palette. If given, it must be a bytearray, an array or a list of ints between 0-255. The list must consist of all channels for one color followed by the next color (e.g. RGBRGBRGB). Defaults to an empty palette. RGBNstrz(Sequence[int] | bytes | bytearray | NoneNone)modepalettereturncCs"||_d|_|pt|_d|_dSN)rrawmode bytearrayrdirty)selfrrr:/usr/local/lib/python3.9/site-packages/PIL/ImagePalette.py__init__*s zImagePalette.__init__!Sequence[int] | bytes | bytearray)rcCs|jSr)_paletterrrrr4szImagePalette.palette)rrcCsd|_||_dSr)_colorsr)rrrrrr8szdict[tuple[int, ...], int]cCsh|jdurbt|j}i|_tdt|j|D]4}t|j|||}||jvrRq,|||j|<q,|jS)Nr)rlenrrangertuple)rZmode_lenicolorrrrcolors=s   zImagePalette.colors)r$rcCs ||_dSr)r)rr$rrrr$IscCs<t}|j|_|j|_|jdur0|jdd|_|j|_|Sr)r rrrr)rnewrrrcopyMs zImagePalette.copyz-tuple[str, Sequence[int] | bytes | bytearray]cCs |jr|j|jfS|j|fS)z Get palette contents in format suitable for the low-level ``im.putpalette`` primitive. .. warning:: This method is experimental. )rrrtobytesrrrrgetdataXs zImagePalette.getdatabytescCs:|jrd}t|t|jtr$|jStd|j}|S)zUConvert palette to bytes. .. warning:: This method is experimental. !palette contains raw palette dataB)r ValueError isinstancerr)arrayr')rmsgZarrrrrr'cs zImagePalette.tobyteszImage.Image | NonezException | Noneint)imageercCst|jtst|j|_t|jd}d}|rX|jd|jdf}||vrX|d7}qF|dkr|rttt | D] \}}|dkrx||vrx|}qqx|dkrd}t |||S) Nr backgroundZ transparencyrrz$cannot allocate more than 256 colors) r-rrrrinfogetreversedlist enumerateZ histogramr,)rr1r2indexZspecial_colorsr"countr/rrr_new_color_indexss(      zImagePalette._new_color_indexztuple[int, ...])r#r1rc CsR|jrd}t|t|tr8|jdkrZt|dkrx|ddkrLd}t||dd}n|jdkrxt|dkrx|d 7}z |j|WSty4}z|||}t|j t sJ||j|<|dt|j kr|j d|dt ||j |ddd|_ n|j t |7_ d |_ |WYd}~Sd}~00nd t|}t|dS) zgGiven an rgb tuple, allocate palette entry. .. warning:: This method is experimental. r*r r3z/cannot add non-opaque RGBA color to RGB paletteNZRGBAr?rzunknown color specifier: )rr,r-r!rrr$KeyErrorr=rrrr)rrepr)rr#r1r/r2r;rrrgetcolors>          zImagePalette.getcolorz str | IO[str])fprc Cs|jrd}t|t|tr&t|d}|d|d|jdtdD]z}||t|t|j|dt|jD]<}z|d|j |Wq~t y|d Yq~0q~|dqL| d S) zVSave palette to text file. .. warning:: This method is experimental. r*wz # Palette z# Mode:  r5r z 0N) rr,r-ropenwriterr rr IndexErrorclose)rrDr/r"jrrrsaves      &  zImagePalette.save)r N)NN)N)__name__ __module__ __qualname____doc__rpropertyrsetterr$r&r(r'Ztostringr=rCrMrrrrr s*     +r rr)rdatarcCst}||_||_d|_|S)Nr)r rrr)rrTrrrrraws rUr0floatz list[int])blackwhitercs.|dkrfddtdDSd}t|dS)Nrcsg|]}t|dqSr@r0.0r"rXrr z#make_linear_lut..r5z"unavailable when black is non-zero)r NotImplementedError)rWrXr/rr\rmake_linear_lutsr`)exprcsfddtdDS)Ncs$g|]}t|dddqS)go@g?rYrZrarrr]r^z"make_gamma_lut..r5)r rbrrbrmake_gamma_lutsrcr )rrcs4ttdt}|tfdd|DS)Nr5csg|]}|tqSrrrZrrrr]r^znegative..)r9r rreverser rrrrernegativesrhcs4ddlmfddtdt|D}t||S)Nrrandintcsg|]}ddqS)rr?r)r[_rirrr]r^zrandom..r5)randomrjr rr rgrrirrls rl#fff0c0)rXrcs0ddt|DtdfddtdDS)NcSsg|]}td|qS)r)r`)r[Zbandrrrr]r^zsepia..r cs g|]}|d|dqS)r3rrZZbandsrrr]r^i)r Zgetrgbr r r\rrnrsepiasrocs,ttdt}tfdd|DS)Nr5csg|]}|tqSrrdrZrerrr]r^zwedge..)r9r rr rgrrerwedgesrpztuple[bytes, str])filenamerc Cst|dr}tjtjtjg}|D]@}z$|d||}|rFWqnWq ttfy^Yq 0q d}t|Wdn1s0Y|S)Nrbrzcannot load palette) rHrrr seekZ getpalette SyntaxErrorr,OSError)rqrDZpaletteHandlersZpaletteHandlerZlutr/rrrloads"     &rv)r )r )rm)r ) __future__rr.collections.abcrtypingrrrrr r r r rUr`rcrhrlrorprvrrrrs   6