You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.2 KiB
45 lines
1.2 KiB
# 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 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")
|