Drawing and Displaying an Image with PIL

W

W. eWatson

Here's my program:

# fun and games
import Image, ImageDraw

im = Image.open("wagon.tif") # it exists in the same Win XP
# folder as the program
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0,0),(20,140), fill=128)

# How show this final image on a display?

root.mainloop()

It has two problems. One is it crashes with:
draw.line((0,0),(20,140), fill=128)
TypeError: line() got multiple values for keyword argument 'fill'

Secondly, it has no way to display the image drawn on. Is it possible, or do
I have to pass the image off to another module's methods?


--
W. eWatson

(121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
Obz Site: 39° 15' 7" N, 121° 2' 32" W, 2700 feet

Web Page: <www.speckledwithstars.net/>
 
R

r

Here's my program:

# fun and games
import Image, ImageDraw

im = Image.open("wagon.tif") # it exists in the same Win XP
# folder as the program
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0,0),(20,140), fill=128)

# How show this final image on a display?

root.mainloop()

It has two problems. One is it crashes with:
     draw.line((0,0),(20,140), fill=128)
TypeError: line() got multiple values for keyword argument 'fill'

Secondly, it has no way to display the image drawn on. Is it possible, or do
I have to pass the image off to another module's methods?

--
                                W. eWatson

              (121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
               Obz Site:  39° 15' 7" N, 121° 2' 32" W, 2700 feet

                     Web Page: <www.speckledwithstars.net/>

I have not tried your code but i think you need to put your coodinates
in one tuple. Here is an example from the docs

Example
Example: Draw a Grey Cross Over an Image
import Image, ImageDraw
im = Image.open("lena.pgm")
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0, im.size[1], im.size[0], 0), fill=128)
del draw
# write to stdout
im.save(sys.stdout, "PNG")

Hope that helps
 
W

W. eWatson

r said:
Here's my program:

# fun and games
import Image, ImageDraw

im = Image.open("wagon.tif") # it exists in the same Win XP
# folder as the program
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0,0),(20,140), fill=128)

# How show this final image on a display?

root.mainloop()

It has two problems. One is it crashes with:
draw.line((0,0),(20,140), fill=128)
TypeError: line() got multiple values for keyword argument 'fill'

Secondly, it has no way to display the image drawn on. Is it possible, or do
I have to pass the image off to another module's methods?

--
W. eWatson

(121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
Obz Site: 39° 15' 7" N, 121° 2' 32" W, 2700 feet

Web Page: <www.speckledwithstars.net/>

I have not tried your code but i think you need to put your coodinates
in one tuple. Here is an example from the docs

Example
Example: Draw a Grey Cross Over an Image
import Image, ImageDraw
im = Image.open("lena.pgm")
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0, im.size[1], im.size[0], 0), fill=128)
del draw
# write to stdout
im.save(sys.stdout, "PNG")

Hope that helps
That's pretty much the code I used. In fact, I borrowed it from the pdf. I
just tried it, and it output "%PNG".

I'd like to see this displayed in a window. If the fine had written
properly, I could see whether it really drew the lines. It did not fail on
the same draw stmts in my program.

I see my problem, , instead of + between the tuples. I thought I'd seen
another example where the 2-d tuples could be separated.

I see a ImageFile module, but it's not for writing image files simply.

--
W. eWatson

(121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
Obz Site: 39° 15' 7" N, 121° 2' 32" W, 2700 feet

Web Page: <www.speckledwithstars.net/>
 
R

r

Change this line:
draw.line((0,0),(20,140), fill=128)

To This:
draw.line((0,0, 20,140), fill=128)

And you should be good to go. Like you said, if you need to combine 2
tuples you can do:
(1,2)+(3,4)
 
W

W. eWatson

r said:
Change this line:
draw.line((0,0),(20,140), fill=128)

To This:
draw.line((0,0, 20,140), fill=128)

And you should be good to go. Like you said, if you need to combine 2
tuples you can do:
(1,2)+(3,4)
Yes, that's true, but the big question is how to "see" the final image?
Either one employees another module or writes the file into a folder, then
displays it with a paint program?

--
W. eWatson

(121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
Obz Site: 39° 15' 7" N, 121° 2' 32" W, 2700 feet

Web Page: <www.speckledwithstars.net/>
 
B

Bill McClain

Yes, that's true, but the big question is how to "see" the final image?
Either one employees another module or writes the file into a folder, then
displays it with a paint program?

Does im.show() not work?

-Bill
 
P

Peter Otten

W. eWatson said:
Yes, that's true, but the big question is how to "see" the final image?
Either one employees another module or writes the file into a folder, then
displays it with a paint program?

For debugging purposes you can just invoke the show() method

im = Image.open(...)
# modify image
im.show()

If you want to integrate the image into your own Tkinter program -- that is
explained here:

http://effbot.org/tkinterbook/photoimage.htm

Following these instruction you code might become

import Tkinter as tk
import Image
import ImageTk
import ImageDraw
import sys

filename = sys.argv[1]
im = Image.open(filename)

draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line(((0,0),(20,140)), fill=128)


root = tk.Tk()
pi = ImageTk.PhotoImage(im)
label = tk.Label(root, image=pi)
label.pack()
root.mainloop()

Peter
 
W

W. eWatson

Peter said:
W. eWatson said:
Yes, that's true, but the big question is how to "see" the final image?
Either one employees another module or writes the file into a folder, then
displays it with a paint program?

For debugging purposes you can just invoke the show() method

im = Image.open(...)
# modify image
im.show()

If you want to integrate the image into your own Tkinter program -- that is
explained here:

http://effbot.org/tkinterbook/photoimage.htm

Following these instruction you code might become

import Tkinter as tk
import Image
import ImageTk
import ImageDraw
import sys

filename = sys.argv[1]
im = Image.open(filename)

draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line(((0,0),(20,140)), fill=128)


root = tk.Tk()
pi = ImageTk.PhotoImage(im)
label = tk.Label(root, image=pi)
label.pack()
root.mainloop()

Peter
My initial quest was to do it in PIL. That seems impossible, and the way out
is Tkinter. I'm not yet savvy enough with Pythons graphics. I was definitely
leaning towards PhotoImage as the way out. What module is show in?

Repairing my (0,0), ... to (0,0)+, and. replacing arg with ImageOPen,
produces a correct solution.

My NM Tech pdf misses the boat on PhotoImage. I've seen your reference
before, but never looked at PhotoImage. I'll bookmark it. I sure wish it was
in pdf format.

Thanks.


--
W. eWatson

(121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
Obz Site: 39° 15' 7" N, 121° 2' 32" W, 2700 feet

Web Page: <www.speckledwithstars.net/>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,226
Members
46,815
Latest member
treekmostly22

Latest Threads

Top