help debugging noob code - converting binary data to images...

Lie Lie.1296 at gmail.com
Sun Jun 29 11:53:40 CEST 2008


On Jun 29, 4:47 pm, Lie <Lie.1... at gmail.com> wrote:
> On Jun 29, 11:18 am, la... at 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



More information about the Python-list mailing list