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

L

larry

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()
 
L

Lie

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.
 
L

Lie

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.


If you used 'import Tkinter', you'd have to change that code to:
root = Tkinter.Tk()


Because you shadowed the built-in 'open' with the 'from Image import
*', this would call Image.open instead of the built-in open.


If you used 'import Tkinter', you'd have to change that code to:
canvas = Tkinter.Canvas(...)




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():


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.

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
 
L

larry

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
 
L

larry

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!
 

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,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top