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

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • larry@portcommodore.com

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

    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('Can vas')

    #open commodore Cset rom
    cset = open("chargen", "r")

    canvas = Canvas(width=16 , height=16, bg='white')
    canvas.pack(exp and=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_r ectangle(xp,yp, xp+size,yp+size ,
    fill='black', width=0)
    position += 1
    charline += 1
    #save character image
    outfile = "/home/mydir/work/char"+zfill(cch ar,3)+".png"
    canvas.save(out file,"png")
    #clear canvas for next char...
    canvas.create_r ectangle(1,1,si ze*8,size*8, fill='white', width=0)
    root.mainloop()
  • Lie

    #2
    Re: help debugging noob code - converting binary data to images...

    On Jun 29, 11:18 am, la...@portcommo dore.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('Can vas')
    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(exp and=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_r ectangle(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.fromstrin g() should work.
            charline += 1
        #save character image
        outfile = "/home/mydir/work/char"+zfill(cch ar,3)+".png"
        canvas.save(out file,"png")
        #clear canvas for next char...
        canvas.create_r ectangle(1,1,si ze*8,size*8, fill='white', width=0)
    root.mainloop()

    Comment

    • Lie

      #3
      Re: help debugging noob code - converting binary data to images...

      On Jun 29, 4:47 pm, Lie <Lie.1...@gmail .comwrote:
      On Jun 29, 11:18 am, la...@portcommo dore.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('Can vas')
      >
      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(exp and=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_r ectangle(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.fromstrin g() should work.
      >
              charline += 1
          #save character image
          outfile = "/home/mydir/work/char"+zfill(cch ar,3)+".png"
          canvas.save(out file,"png")
          #clear canvas for next char...
          canvas.create_r ectangle(1,1,si ze*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/pi...book/index.htm
      for info on raw mode: http://www.pythonware.com/library/pi...ok/decoder.htm

      Comment

      • larry@portcommodore.com

        #4
        Re: help debugging noob code - converting binary data to images...

        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

        Comment

        • larry@portcommodore.com

          #5
          Re: help debugging noob code - converting binary data to images...

          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+si ze-1,yp+size-1)),
          fill=0 )
          outfile = "/home/mydir/work/char"+string.zf ill(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!

          Comment

          Working...