Howto Extract PNG from binary file @ 0x80?

Fredrik Lundh fredrik at pythonware.com
Sat Dec 11 04:53:19 EST 2004


"flamesrock" <mishpaha at telus.net> wrote:

> As a newbie to the language, I have no idea where to start..please bare
> with me..
>
> The simcity 4 savegame file has a png image stored at the hex location
> 0x80. What I want to extract it and create a file with the .png
> extension in that directory.
>
> Can somebody explain with a snippet of code how I would accomplish
> this? I've looked around but the information is too vague and I don't
> know how to start.

there are *many* ways to ignore the first 128 bytes when you read a file
(you can seek to the right location, you can read 128 bytes and throw them
a way, you can read one byte 128 times and throw each one of them away,
you can read all data and remove the first 128 bytes, etc).

here's a snippet that understands the structure of the PNG, and stops copying
when it reaches the end of the PNG:

import struct

def pngcopy(infile, outfile):

    # copy header
    header = infile.read(8)
    if header != "\211PNG\r\n\032\n":
        raise IOError("not a valid PNG file")
    outfile.write(header)

    # copy chunks, until IEND
    while 1:
        chunk = infile.read(8)
        size, cid = struct.unpack("!l4s", chunk)
        outfile.write(chunk)
        outfile.write(infile.read(size))
        outfile.write(infile.read(4)) # checksum
        if cid == "IEND":
            break

to use this, open the input file (the simcity file) and the output file
(the png file you want to create) in binary mode, use the "seek"
method to move to the right place in the simcity file, and call "pngcopy"
with the two file objects.

    infile = open("mysimcityfile", "rb")
    infile.seek(0x80)
    outfile = open("myimage.png", "wb")
    pngcopy(infile, outfile)
    outfile.close()
    infile.close()

hope this helps!

</F> 






More information about the Python-list mailing list