mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2024-11-14 06:20:32 +01:00
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
|
#!/bin/env python2
|
||
|
|
||
|
from __future__ import print_function
|
||
|
import sys, os, subprocess
|
||
|
from os import listdir
|
||
|
from os.path import isfile, join, sep
|
||
|
|
||
|
def eprint(*args, **kwargs):
|
||
|
print(*args, file=sys.stderr, **kwargs)
|
||
|
|
||
|
def which(program):
|
||
|
import os
|
||
|
def is_exe(fpath):
|
||
|
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
|
||
|
|
||
|
fpath, fname = os.path.split(program)
|
||
|
if fpath:
|
||
|
if is_exe(program):
|
||
|
return program
|
||
|
else:
|
||
|
for path in os.environ["PATH"].split(os.pathsep):
|
||
|
path = path.strip('"')
|
||
|
exe_file = os.path.join(path, program)
|
||
|
if is_exe(exe_file):
|
||
|
return exe_file
|
||
|
|
||
|
return None
|
||
|
|
||
|
try:
|
||
|
from PIL import Image
|
||
|
except ImportError:
|
||
|
eprint("Could not import PIL, is it installed ?")
|
||
|
sys.exit(1)
|
||
|
|
||
|
uskins_path = "u_skins"
|
||
|
meta_path = join(uskins_path, "meta")
|
||
|
textures_path = join(uskins_path, "textures")
|
||
|
pngcrush = which('pngcrush')
|
||
|
optipng = which('optipng')
|
||
|
|
||
|
def process_copies(src, dst, copies):
|
||
|
for copy in copies:
|
||
|
srcrect = copy[0]
|
||
|
dstrect = copy[1]
|
||
|
flip = copy[2] if len(copy) > 2 else None
|
||
|
region = src.crop(srcrect)
|
||
|
if flip is not None:
|
||
|
region = region.transpose(flip)
|
||
|
dst.paste(region, dstrect)
|
||
|
|
||
|
def make_preview(src, dst):
|
||
|
skin = Image.open(src)
|
||
|
preview = Image.new('RGBA', (16, 32))
|
||
|
process_copies(skin, preview, [
|
||
|
[(8, 8, 16, 16), (4, 0)], # Head
|
||
|
[(44, 20, 48, 32), (0, 8)], # Left arm
|
||
|
[(44, 20, 48, 32), (12, 8), Image.FLIP_LEFT_RIGHT], # Right arm
|
||
|
[(20, 20, 28, 32), (4, 8)], # Body
|
||
|
[(4, 20, 8, 32), (4, 20)], # Left leg
|
||
|
[(4, 20, 8, 32), (8, 20), Image.FLIP_LEFT_RIGHT], # Right leg
|
||
|
])
|
||
|
overlay = Image.new('RGBA', (16, 32))
|
||
|
process_copies(skin, overlay, [
|
||
|
[(40, 8, 48, 16), (4, 0)], # Head
|
||
|
])
|
||
|
preview = Image.alpha_composite(preview, overlay)
|
||
|
preview.save(dst)
|
||
|
if optipng is not None:
|
||
|
p = subprocess.Popen([optipng, '-o7', '-quiet', dst])
|
||
|
p.wait()
|
||
|
elif pngcrush is not None:
|
||
|
p = subprocess.Popen([pngcrush, '-ow', '-s', dst])
|
||
|
p.wait()
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
metas = [f for f in listdir(meta_path) if
|
||
|
isfile(join(meta_path, f)) and
|
||
|
f.endswith(".txt")]
|
||
|
for meta in metas:
|
||
|
f = open(join(meta_path, meta), 'r')
|
||
|
metadata = f.read().splitlines()
|
||
|
f.close()
|
||
|
skin = meta[:-4]
|
||
|
print("Processing {} \"{}\" by {} ({})...".format(skin, metadata[0], metadata[1], metadata[2]))
|
||
|
make_preview(join(textures_path, skin + ".png"), join(textures_path, skin + "_preview.png"))
|