1
0
mirror of synced 2025-02-02 04:17:54 +01:00
jujube/utils/spritesheet_spliter.py

46 lines
1.5 KiB
Python
Raw Normal View History

2020-05-23 00:04:13 +02:00
from itertools import product
from math import sqrt, ceil
from PIL import Image
from path import Path
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("file", type=Path)
parser.add_argument("sprite_size", type=int)
parser.add_argument("-o", "--output-folder", type=Path)
parser.add_argument("--name-prefix", default="")
parser.add_argument("--name-pattern", default="{i:0{n}}{ext}")
args = parser.parse_args()
if args.output_folder is not None:
args.output_folder.mkdir_p()
else:
args.output_folder = Path("./")
assert args.sprite_size > 0, f"Invalid sprite_size : {args.sprite_size}"
image = Image.open(args.file)
width, height = image.size
if width % args.sprite_size != 0:
print(f"Error : image width ({width}) is not a multiple of {args.sprite_size}")
exit(1)
if height % args.sprite_size != 0:
print(f"Error : image height ({height}) is not a multiple of {args.sprite_size}")
exit(1)
number_of_sprites = (width // args.sprite_size) * (height // args.sprite_size)
for i, (y, x) in enumerate(product(range(height // args.sprite_size), range(width // args.sprite_size))):
sprite = image.crop(
box=(
x*args.sprite_size,
y*args.sprite_size,
(x+1)*args.sprite_size,
(y+1)*args.sprite_size
)
)
sprite.save(
args.output_folder/
args.name_prefix+
args.name_pattern.format(
i=i,
n=len(str(number_of_sprites)),
ext=args.file.ext
)
)