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.