|
Prev: Why is recursion so slow?
Next: What is "@" used for ?
From: larry on 29 Jun 2008 00:18 Ok I'm a Python noob, been doing OK so far, working on a data conversion program and want to create some character image files from an 8-bit ROM file. Creating the image I've got down, I open the file and use TK to draw the images... but 1) It does not seem to end (running in IDLE), I have to kill the process to retry it seems tkinter does not close(?) 2) Once I added the Image module open won't open my binary file (complains its not an image file, which is isnt.) I am sure I need to prefix open with something but I can't seem to find an example of how to word it, Below is the code (if it is lousy its because I've mainly been borrowing by examples as I go...) Any suggestions are gretly appreciated. #!/usr/local/bin/python from Tkinter import * from string import * from Image import * root = Tk() root.title('Canvas') #open commodore Cset rom cset = open("chargen","r") canvas = Canvas(width=16, height=16, bg='white') canvas.pack(expand=YES, fill=BOTH) # character size factor size = 2 # read all 512 characters from ROM for cchar in range(0, 511, 1): #draw line while charline < 8: position = 0 x = cset.read(1) ch = ord(x) # draw pixels while position < 8: if ch & ( 2 ** position ): xp = 1+(7-position)*size yp = 1+charline*size canvas.create_rectangle(xp,yp,xp+size,yp+size, fill='black', width=0) position += 1 charline += 1 #save character image outfile = "/home/mydir/work/char"+zfill(cchar,3)+".png" canvas.save(outfile,"png") #clear canvas for next char... canvas.create_rectangle(1,1,size*8,size*8, fill='white', width=0) root.mainloop()
From: Lie on 29 Jun 2008 05:47 On Jun 29, 11:18 am, la...(a)portcommodore.com wrote: > Ok I'm a Python noob, been doing OK so far, working on a data > conversion program and want to create some character image files from > an 8-bit ROM file. > > Creating the image I've got down, I open the file and use TK to draw > the images... but > > 1) It does not seem to end (running in IDLE), I have to kill the > process to retry it seems tkinter does not close(?) > > 2) Once I added the Image module open won't open my binary file > (complains its not an image file, which is isnt.) I am sure I need to > prefix open with something but I can't seem to find an example of how > to word it, > > Below is the code (if it is lousy its because I've mainly been > borrowing by examples as I go...) Any suggestions are gretly > appreciated. > > #!/usr/local/bin/python > > from Tkinter import * > from string import * > from Image import * DON'T DO THAT... You're importing everything to the current namespace and this corrupts the current namespace, specifically the 'open' function inside Image.open would shadow the built-in 'open' function. use: import Tkinter import string import Image There are use cases where doing 'from blah import *' is useful, such as importing constants, but in general try to avoid importing everything to current namespace. > root = Tk() > root.title('Canvas') If you used 'import Tkinter', you'd have to change that code to: root = Tkinter.Tk() > #open commodore Cset rom > cset = open("chargen","r") Because you shadowed the built-in 'open' with the 'from Image import *', this would call Image.open instead of the built-in open. > canvas = Canvas(width=16, height=16, bg='white') If you used 'import Tkinter', you'd have to change that code to: canvas = Tkinter.Canvas(...) > canvas.pack(expand=YES, fill=BOTH) > > # character size factor > size = 2 > > # read all 512 characters from ROM > for cchar in range(0, 511, 1): You can use this instead: for cchar in range(511): but beware, this creates range with length 511 (so do the original range), which means you're lacking on space for the last char. You probably wanted this instead: for cchar in range(512): But again, python can loop directly over string/list/file, etc, so this might be best: for char in cset.read(): > #draw line > while charline < 8: > position = 0 > x = cset.read(1) > ch = ord(x) > # draw pixels > while position < 8: > if ch & ( 2 ** position ): > xp = 1+(7-position)*size > yp = 1+charline*size > canvas.create_rectangle(xp,yp,xp+size,yp+size, > fill='black', width=0) > position += 1 Since you're planning to use Image module (from PIL/Python Imaging Library) why not use functions from Image instead to create the image. The format of the file you're using seems to be RAW format (i.e. simple uncompressed bitmap, without any kinds of header). That means Image.fromstring() should work. > charline += 1 > #save character image > outfile = "/home/mydir/work/char"+zfill(cchar,3)+".png" > canvas.save(outfile,"png") > #clear canvas for next char... > canvas.create_rectangle(1,1,size*8,size*8, fill='white', width=0) > root.mainloop()
From: Lie on 29 Jun 2008 05:53 On Jun 29, 4:47 pm, Lie <Lie.1...(a)gmail.com> wrote: > On Jun 29, 11:18 am, la...(a)portcommodore.com wrote: > > > > > Ok I'm a Python noob, been doing OK so far, working on a data > > conversion program and want to create some character image files from > > an 8-bit ROM file. > > > Creating the image I've got down, I open the file and use TK to draw > > the images... but > > > 1) It does not seem to end (running in IDLE), I have to kill the > > process to retry it seems tkinter does not close(?) > > > 2) Once I added the Image module open won't open my binary file > > (complains its not an image file, which is isnt.) I am sure I need to > > prefix open with something but I can't seem to find an example of how > > to word it, > > > Below is the code (if it is lousy its because I've mainly been > > borrowing by examples as I go...) Any suggestions are gretly > > appreciated. > > > #!/usr/local/bin/python > > > from Tkinter import * > > from string import * > > from Image import * > > DON'T DO THAT... > > You're importing everything to the current namespace and this corrupts > the current namespace, specifically the 'open' function inside > Image.open would shadow the built-in 'open' function. > > use: > import Tkinter > import string > import Image > > There are use cases where doing 'from blah import *' is useful, such > as importing constants, but in general try to avoid importing > everything to current namespace. > > > root = Tk() > > root.title('Canvas') > > If you used 'import Tkinter', you'd have to change that code to: > root = Tkinter.Tk() > > > #open commodore Cset rom > > cset = open("chargen","r") > > Because you shadowed the built-in 'open' with the 'from Image import > *', this would call Image.open instead of the built-in open. > > > canvas = Canvas(width=16, height=16, bg='white') > > If you used 'import Tkinter', you'd have to change that code to: > canvas = Tkinter.Canvas(...) > > > canvas.pack(expand=YES, fill=BOTH) > > > # character size factor > > size = 2 > > > # read all 512 characters from ROM > > for cchar in range(0, 511, 1): > > You can use this instead: > for cchar in range(511): > > but beware, this creates range with length 511 (so do the original > range), which means you're lacking on space for the last char. > You probably wanted this instead: > for cchar in range(512): > > But again, python can loop directly over string/list/file, etc, so > this might be best: > for char in cset.read(): > > > #draw line > > while charline < 8: > > position = 0 > > x = cset.read(1) > > ch = ord(x) > > # draw pixels > > while position < 8: > > if ch & ( 2 ** position ): > > xp = 1+(7-position)*size > > yp = 1+charline*size > > canvas.create_rectangle(xp,yp,xp+size,yp+size, > > fill='black', width=0) > > position += 1 > > Since you're planning to use Image module (from PIL/Python Imaging > Library) why not use functions from Image instead to create the image. > The format of the file you're using seems to be RAW format (i.e. > simple uncompressed bitmap, without any kinds of header). That means > Image.fromstring() should work. > > > charline += 1 > > #save character image > > outfile = "/home/mydir/work/char"+zfill(cchar,3)+".png" > > canvas.save(outfile,"png") > > #clear canvas for next char... > > canvas.create_rectangle(1,1,size*8,size*8, fill='white', width=0) > > root.mainloop() > > btw, PIL Handbook is a good tutorial/reference for Python Imaging Library: http://www.pythonware.com/library/pil/handbook/index.htm for info on raw mode: http://www.pythonware.com/library/pil/handbook/decoder.htm
From: larry on 29 Jun 2008 11:16 Wonderful, thank you! Will try them out this evening. The image module syntax looks more like what I was expecting than TKinter. All the online drawing examples I found yesterday used TKinter; image was only shown to manipulate pre-made images. Larry
From: larry on 29 Jun 2008 23:47 success, had to fill in a few blanks with some more googling, here is the finished script (used all for loops this time, saved a few more lines): ========== #!/usr/local/bin/python import string import Image, ImageDraw size = 2 im = Image.new("1",[8*size,8*size],1) draw = ImageDraw.Draw(im) cset = open("chargen","r") for cchar in range(0, 512, 1): for charline in range(0, 8, 1): x = cset.read(1) ch = ord(x) for position in range(0, 8, 1): if ch & ( 2 ** position ): xp = (7-position)*size yp = charline*size draw.rectangle(((xp,yp),(xp+size-1,yp+size-1)), fill=0 ) outfile = "/home/mydir/work/char"+string.zfill(cchar,3)+".png" im.save(outfile,"png") draw.rectangle(((0,0),(size*8,size*8)),fill=1) im.show() ========== It does the variable sizes like I wanted and it now sure is fast. If I wanted to display an image without saving how do I do that, on the image module it does not pop up a canvas.. the im.show() on the bottom does not seem to work. Thanks again!
|
Pages: 1 Prev: Why is recursion so slow? Next: What is "@" used for ? |