Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Drawing and Displaying an Image with PIL (http://www.velocityreviews.com/forums/t667548-drawing-and-displaying-an-image-with-pil.html)

W. eWatson 01-28-2009 03:15 AM

Drawing and Displaying an Image with PIL
 
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 01-28-2009 03:30 AM

Re: Drawing and Displaying an Image with PIL
 
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=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. eWatson 01-28-2009 04:43 AM

Re: Drawing and Displaying an Image with PIL
 
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=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 01-28-2009 05:45 AM

Re: Drawing and Displaying an Image with PIL
 
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. eWatson 01-28-2009 11:45 AM

Re: Drawing and Displaying an Image with PIL
 
r wrote:
> 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/>


Bill McClain 01-28-2009 12:53 PM

Re: Drawing and Displaying an Image with PIL
 
On 2009-01-28, W. eWatson <notvalid2@sbcglobal.net> 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
info@sattre-press.com http://sattre-press.com/tow.html

Peter Otten 01-28-2009 12:58 PM

Re: Drawing and Displaying an Image with PIL
 
W. eWatson wrote:

> r wrote:
>> 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?


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. eWatson 01-29-2009 02:13 AM

Re: Drawing and Displaying an Image with PIL
 
Peter Otten wrote:
> W. eWatson wrote:
>
>> r wrote:
>>> 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?

>
> 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/>



All times are GMT. The time now is 05:16 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.