#!/usr/bin/env python3 """Decode a catalog picture into transparent PNG source references; never redraw art.""" import argparse import struct from pathlib import Path from PIL import Image def decode(path, palette): data = path.read_bytes() kind, _, _, width, height = struct.unpack_from('>4) for c in pal[i:i+3]) for i in range(0,768,3)] size, relative = entries[args.asset] source = (args.data / relative).resolve() if not source.is_relative_to(args.data.resolve()) or source.stat().st_size != size: raise ValueError('invalid catalog entry') image = decode(source, palette) if args.preview_scale < 1 or args.preview_scale > 32: raise ValueError('preview scale must be 1..32') if args.preview_scale != 1: image = image.resize((image.width * args.preview_scale, image.height * args.preview_scale), Image.Resampling.NEAREST) args.output.parent.mkdir(parents=True, exist_ok=True) image.save(args.output) print(f'{args.asset:05x}: {image.width}x{image.height} -> {args.output}') if __name__ == '__main__': main()