Lire des morceaux PNG

Pratiquez la manipulation de fichiers binaires avec Python 3.6 ou version ultérieure

Puisque PNG a une structure de fichier simple, j'ai pensé que cela pourrait être bon pour pratiquer Python.

from binascii import crc32


def read_png_iter(fname):
    """Itérateur limité aux fichiers PNG. Le traitement des blocs est renvoyé à d'autres fonctions."""
    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):
    """Traitement des blocs IHDR"""
    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):
    """Les autres blocs affichent simplement le nom"""
    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])

Je l'ai écrit en tant que fonction car il n'affiche que des informations sur les morceaux, mais je pense que cela devrait être géré par une classe à la fin. 2017/08/03 Partiellement modifié.

Recommended Posts

Lire des morceaux PNG
Lire le fichier
Lire pid.h