# byte is assumed to be octet # char is assumed to be 1 byte # # struct rawimg { # char[8] magic_num = "rifV0001" // Big Endian. UTF-8 Encoded. 72 69 66 56 30 30 30 31 # uint64_t width; // Big Endian # uint8_t format; # uint8_t[] data; # } # # struct rawimg_little { # char[8] magic_num = "lifV0001" // Big Endian. UTF-8 Encoded. 6C 69 66 56 30 30 30 31 # uint64_t width; // Little Endian # uint8_t format; # uint8_t[] data; # } # # formats: # 0x00 = (24 bits / 3 bytes) R8 B8 G8 # 0x01 = (32 bits / 4 bytes) R8 B8 G8 A8 # ... undefined in V0001 # # data is a flat array, starting at top left, going right then bottom. from PIL import Image import numpy as np import sys # RGB, RGBA frm_sizes = [3, 4] frm_names = ["RGB", "RGBA"] f_in = open(sys.argv[1], "rb") order = f_in.read(1) magic = order+f_in.read(7) width = int.from_bytes(f_in.read(8), byteorder=("big" if order == b'r' else "little")) formt = int.from_bytes(f_in.read(1)) data = f_in.read() frm_size = frm_sizes[formt] height = (len(data)//frm_size)//width print(width, height) img = Image.frombuffer(frm_names[formt], (width, height), data, "raw", frm_names[formt], 0, 1) img.save('.'.join(sys.argv[1].split(".")[:1])+".png")