Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Drawing and Displaying an Image with PIL

Reply
Thread Tools

Drawing and Displaying an Image with PIL

 
 
W. eWatson
Guest
Posts: n/a
 
      01-28-2009
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=12
draw.line((0,0),(20,140), fill=12

# 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=12
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/>

 
Reply With Quote
 
 
 
 
r
Guest
Posts: n/a
 
      01-28-2009
On Jan 27, 9:15*pm, "W. eWatson" <notval...@sbcglobal.net> wrote:
> 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=12
> draw.line((0,0),(20,140), fill=12
>
> # 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=12
> 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=12
draw.line((0, im.size[1], im.size[0], 0), fill=12
del draw
# write to stdout
im.save(sys.stdout, "PNG")

Hope that helps
 
Reply With Quote
 
 
 
 
W. eWatson
Guest
Posts: n/a
 
      01-28-2009
r wrote:
> On Jan 27, 9:15 pm, "W. eWatson" <notval...@sbcglobal.net> wrote:
>> 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=12
>> draw.line((0,0),(20,140), fill=12
>>
>> # 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=12
>> 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=12
> draw.line((0, im.size[1], im.size[0], 0), fill=12
> 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/>

 
Reply With Quote
 
r
Guest
Posts: n/a
 
      01-28-2009
Change this line:
draw.line((0,0),(20,140), fill=12

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

And you should be good to go. Like you said, if you need to combine 2
tuples you can do:
(1,2)+(3,4)
 
Reply With Quote
 
W. eWatson
Guest
Posts: n/a
 
      01-28-2009
r wrote:
> Change this line:
> draw.line((0,0),(20,140), fill=12
>
> To This:
> draw.line((0,0, 20,140), fill=12
>
> 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/>

 
Reply With Quote
 
Bill McClain
Guest
Posts: n/a
 
      01-28-2009
On 2009-01-28, W. eWatson <> wrote:
> 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
--
Sattre Press Tales of War
http://sattre-press.com/ by Lord Dunsany
http://sattre-press.com/tow.html
 
Reply With Quote
 
Peter Otten
Guest
Posts: n/a
 
      01-28-2009
W. eWatson wrote:

> r wrote:
>> Change this line:
>> draw.line((0,0),(20,140), fill=12
>>
>> To This:
>> draw.line((0,0, 20,140), fill=12
>>
>> 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?


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=12
draw.line(((0,0),(20,140)), fill=12


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

Peter
 
Reply With Quote
 
W. eWatson
Guest
Posts: n/a
 
      01-29-2009
Peter Otten wrote:
> W. eWatson wrote:
>
>> r wrote:
>>> Change this line:
>>> draw.line((0,0),(20,140), fill=12
>>>
>>> To This:
>>> draw.line((0,0, 20,140), fill=12
>>>
>>> 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?

>
> 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=12
> draw.line(((0,0),(20,140)), fill=12
>
>
> 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/>

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
PIL: problem to convert an image array to PIL format Sverre Python 2 12-17-2009 04:33 PM
Guide to the standard library? Library for drawing in GUIs?drawing inbrowsers? defn noob Java 1 06-28-2008 02:50 AM
funny drawing software:ScreenPen,drawing directly on screen! yyzzbb@sina.com Digital Photography 0 02-04-2006 12:31 AM
System.Drawing For Drawing Text Images jjbutera@hotmail.com ASP .Net 1 01-09-2006 09:55 PM
PIL and line drawing Leonard J. Reder Python 4 05-24-2005 07:57 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57