Hello Everyone,

I have a problem pasting RGBA images to RGBA images.
It's a bit hard to describe the output, but it seems like the alpha channel of 
the original image is affected by the pasted image alpha channel, so the 
original images becomes transparent in places it wasn't before.
I googled around and only found answers regarding the third "mask" parameter of 
the paste function, but that didn't help in the case of two RGBA images.
In most PIL use cases people paste RGBA images to RGB images (ex. watermarking 
images) so the current setup doesn't result in any artifacts, but in my case 
with two RGBA images it does.

I looked further in the source code and found the related code in Paste.c:

Line 134:
paste_mask_RGBA()
….
for (i = 0; i < pixelsize; i++) {
        *out = BLEND(*mask, *out, *in, tmp1, tmp2);
        out++, in++;
}
…

So all 4 channels (R,G,B,A) are handled the same way.

I looked up the topic and found this useful Cairo project page which describes 
all of the widely used operators in image processing but none of them seemed to 
match this behavior. (http://cairographics.org/operators/)
Finally I modified the source code to my needs, and implemented the 
CAIRO_OPERATOR_OVER for PIL, handling the alpha channel blending separately, 
following the description in the Cairo docs.


But I am still wondering if anybody ever had the same problem, or if there is 
some more simple and elegant solution by just parametrize the PIL functions 
differently? (I couldn't find one)
Also I think the CAIRO_OPERATOR_OVER behavior is the one that most people would 
expect from a paste function so I would recommend to change the source code 
accordingly if no simple solution is available.


Thanks for your answers in advance, I hope my description is clear enough.

Daniel 




_______________________________________________
Image-SIG maillist  -  Image-SIG@python.org
http://mail.python.org/mailman/listinfo/image-sig

Reply via email to