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