Hi Laszlo, Isn't this the way it should work? The alpha value of a pixel is treated the same way as any other channel. When a pixel is half covered by a shape, PIL wil draw 50% of the foreground and 50% of the background. In your case: a green shape 0, 255, 0, 255 (rgba) and background 255, 0, 0, 0. If you take the average of the two you come up with R=128 in the pixel and will be visible for 50% A=128. Isn't this the desired effect? And if it would be a color? Don't you want the same to happen?
The solution? Render the shape on a 0,0,0,0 background. No red will be added, your half filled pixel with a correct alpha value will blend with new backgrounds as it is supposed to. You can save this image in various ways for later use. Just my thought... and i hope it helps. Greetings, Coen Laszlo Nagy wrote: > > Hi All, > > I tried to put a text on a transparent image. Here is a test: > > import Image > import ImageDraw > import ImageFont > > img = Image.new('RGBA',(100,20),(255,0,0,0)) > drawer = ImageDraw.Draw(img) > fnt = ImageFont.truetype("Vera.ttf",20) # > http://ftp.gnome.org/pub/GNOME/sources/ttf-bitstream-vera/1.10/ > drawer.text((0,0),"ABCDE",font=fnt,fill="#00ff00") > img.save("test.png") # Result image > > I'm working on a rendering engine but I created this example to show > the problem. The rendering engine should be able to create an image > with transparent parts, and one should be able to put the rendered > image on top of any other image. > > The problem itself: font edges are interpolated between the background > and foreground color. You can see it on the resulting image. If you > open the created "test.png" file in GIMP and use the color picker tool > then you can see values like: > > (203,52,0,52) > (215,40,0,40) > > > I think that this is bad. The background was fully transparent. If you > put a green object on a fully transparent thing, you should never see > any red in it. I believe that the result should be something like > > (0,52,0,52) > (0,40,0,40) > > In other words, when antialiasing a text, the background pixel's color > should be weighted with its transparency. In my example, the > background pixel is fully red but should have zero weight. > > Workarounds? > > Working with black or white initial background is not a workaround, > because PIL will darken/lighten the pixels. I used red+green just to > make the problem more visible. A correct workaround is to use the > actual target background that will finally be used, but it is not a > good workaround. This is obvious: I want to render the result image > once, then put it on different target images. Rendering the result > image each time I need to put it on a target would be very slow. > > Can you please confirm if this is a bug in PIL? Comments welcome. > > Best, > > Laszlo > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------ > > _______________________________________________ > Image-SIG maillist - Image-SIG@python.org > http://mail.python.org/mailman/listinfo/image-sig > _______________________________________________ Image-SIG maillist - Image-SIG@python.org http://mail.python.org/mailman/listinfo/image-sig