[PYTHON] Lesen Sie PNG-Chunks

Üben Sie den Umgang mit Binärdateien mit Python 3.6 oder höher

Da PNG eine einfache Dateistruktur hat, dachte ich, es könnte gut zum Üben von Python sein.

from binascii import crc32


def read_png_iter(fname):
    """Iterator auf PNG-Dateien beschränkt. Die Chunk-Verarbeitung wird auf andere Funktionen übertragen."""
    with open(fname, 'rb') as a_file:
        if a_file.read(8) != b'\x89PNG\r\n\x1a\n':
            raise Exception
        datl = a_file.read(4)
        while datl != b'':
            length = int.from_bytes(datl, 'big')
            data = a_file.read(4 + length)
            if int.from_bytes(a_file.read(4), 'big') != crc32(data):
                raise Exception
            yield (data[:4], data[4:])
            datl = a_file.read(4)


def ihdr_chunk(name, data):
    """Verarbeitung für IHDR-Chunks"""
    print(name)
    print(f'w:{int.from_bytes(data[:4], "big")}')
    print(f'h:{int.from_bytes(data[4:8], "big")}')


def png_chunk(name, data):
    """Andere Chunks zeigen nur den Namen an"""
    print(name)

if __name__ == '__main__':
    funcs = {b'IHDR': ihdr_chunk}
    for chunk in read_png_iter('test.png'):
        funcs.get(chunk[0], png_chunk)(chunk[0], chunk[1])

Ich habe es als Funktion geschrieben, weil es nur Chunk-Informationen anzeigt, aber ich denke, dass es am Ende von einer Klasse behandelt werden sollte. 2017/08/03 Teilweise geändert.

Recommended Posts

Lesen Sie PNG-Chunks
Datei lesen
Lesen Sie pid.h.