46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
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
|
|
)
|
|
) |