PIL\Tkinter and Transparencies, Rubber Lines, and Dragging Image Objects

Eric Brunel eric.brunel at nospam-pragmadev.com
Tue Apr 7 06:58:18 EDT 2009


W. eWatson wrote:
> Basically, I'd like to know how one (broadly, e.g., references in Win-land)
> does IP (image processing) and drawing techniques such as rubber lines, and
> dragging image objects across the canvas. I know there are some pretty
> powerful toolkits out there, but I'd like to limit this to PIL and Tkinter.
> If it can't be done with them, then I'll consider other possibilities.  As a
> starter, on the topic of transparencies, consider this program that I pulled
> off the web and was posted in 1999. It purports to illustrate how one might
> produce a transparency.

OK, maybe I'm dumb but:

>     #!/usr/bin/python
>     # see http://mail.python.org/pipermail/python-list/1999-May/003388.html
>     from Tkinter import *
>     import Image, ImageTk
>     import tkFileDialog
>
>     class Transparency:
>      def __init__(self, parent):
>       self.canvas = Canvas(parent, bg='green')
>       self.canvas.pack()
>       b = Button(parent, command=self.open, text="Select graphics file")
>       b.pack()
>
>      def open(self):
>       self.canvas.delete(ALL)
>       filename = tkFileDialog.askopenfilename()
>       if filename != '':
>        im = Image.open(filename)
>        if im.mode != "RGBA":
>         im = Image.open(filename).convert("RGBA")
>         source = im.split()
>         R, G, B, A = 0, 1, 2, 3
>         mask = im.point(lambda i: i > 0 and 255) # use black as transparent
                                                     ^^^^^^^^^^^^^^^^^^^^^^^^

>         source[A].paste(mask)
>         im = Image.merge(im.mode, source)  # build a new multiband image
>
>        self.graphic = ImageTk.PhotoImage(image=im)
>        self.canvas.create_image(100, 100, image=self.graphic)
>     if __name__ == "__main__":
>      root = Tk()
>      test = Transparency(root)
>      root.mainloop()
>
> It colors the canvas green, and produces a black background. An image is
> merged with the background. I tried out the program. It executes, but I
> do not see where the transparency is apparent. I used a gif with a
> picture of a telescope on a white background, and the result is what I
                              ^^^^^^^^^^^^^^^^

> would see if I pasted the telescope and white background onto the green
> canvas.

I have neither PIL, nor the image you're using so I can just guess. But if you
want to use a white background, maybe you should use a mask defined with:

mask = im.point(lambda i: 255 if i >= 255 else 0)

(if I understood the mask construction correctly...).

HTH
 - Eric -



More information about the Python-list mailing list