[Image-SIG] I'm confused by alpha blending.

Fredrik Lundh fredrik at pythonware.com
Tue Mar 21 23:12:54 CET 2006

Ned Batchelder wrote:

> I'm using PIL to composite a drop shadow onto an image.  The blending
> isn't working the way I would expect.  The drop shadow image itself has
> all black pixels, with all of the interesting stuff happening in the
> alpha channel.  I'm using Image.paste to draw the drop shadow, by
> specifying the shadow png as both the image and the mask.
> When I do this on a pure black image, the shadow lightens the pixels!
> For example, a black existing pixel gets a shadow pixel that is black
> with alpha value of 152 decimal. The result should be black (since both
> the source and the destination are black, how can the alpha channel
> lighten the pixel?), but it comes out with a value of 100 decimal.
> When I graph the background color against the resulting color (using a
> fixed black shadow pixel with 152 alpha), the result is linear, but as I
> say, it lightens black pixels inexplicably.
> Is there something I am doing wrong?

sounds confusing, indeed.

are you 100% sure that the source pixels are black ?

what happens if you do paste("black", shadow) on a black image ?

what happens on your machine if you do:

>>> from PIL import Image
>>> Image.VERSION
>>> bg = Image.new("RGB", (100, 100), "black")
>>> bg.getcolors()
[(10000, (0, 0, 0))]

>>> shadow = Image.new("RGB", (100, 100), 0)
>>> alpha = Image.new("L", (100, 100), None)
>>> alpha.putdata(range(0,200,2)*100)
>>> shadow.putalpha(alpha)
>>> shadow.mode
>>> len(shadow.getcolors())

>>> bg.paste(shadow, shadow)
>>> bg.getcolors()
[(10000, (0, 0, 0))]


More information about the Image-SIG mailing list