136 lines
4.7 KiB
Python
Executable file
136 lines
4.7 KiB
Python
Executable file
#! /usr/bin/env python3
|
|
|
|
import os, sys, argparse, re, base64
|
|
from io import BytesIO
|
|
|
|
try:
|
|
from PIL import Image
|
|
except ImportError:
|
|
print("""Please install the Python Pillow Library to run this script.
|
|
You can download it from https://pypi.python.org/pypi/Pillow
|
|
On Debian and Ubuntu you can also type in a Terminal
|
|
sudo apt-get install python-pil""", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
suffix_re = re.compile(".*-(n|s|w|e|ne|nw|sw|se|[0-9]+)([-.]).*")
|
|
anim_re = re.compile(".*-(attack|defend|melee|ranged|magic|idle|die|dying|death|flying|leading|healing).*")
|
|
# the default mask is a png RGBA file encoded in base64
|
|
default_mask = b"""
|
|
iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAA/UlEQVR42u3cWwoCMRBFQfe/6Tg/
|
|
gsg8b4bWxhLOAixEnSSdxxjjlpbX+KXuel8NcPIANQAKcGoDVAOU43QIUAFQhNMpQAVAAU6vABUA
|
|
BTi9AlQAFOD0ClABUIDTK0AFQAFOrwAVAAU4vQI0CzSP0z9AE0B/j/MKUAgE5y1AARCcjwBdBIKz
|
|
EqALQHA2AnQSCM5OgE4AwdnPp+cgX9C+gybyM+9/UJ5HDc9ieZY7rAflWXK1Jp1n28e+WJ6tZ3vz
|
|
eY6/OB+U5wieM4p5jgE7J51nFMGsRp5xKPNieUYyzazmGQs3N5/nagp3d+S5Hsf9QXmu6HKH2XeB
|
|
XBN40BNK3ENj+y1ozgAAAABJRU5ErkJggg=="""
|
|
|
|
parser = argparse.ArgumentParser(
|
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
description="Search png images not fitting in a hex",
|
|
epilog="""return numbers of pixels out of the hex for each filename
|
|
(-1 if the image is not a standard 72x72 image and -f was not used)"""
|
|
)
|
|
parser.add_argument("-m", "--mask",
|
|
action="store",
|
|
metavar="file",
|
|
help="""choose which image use as mask
|
|
(default is a mask embedded in the script)"""
|
|
)
|
|
parser.add_argument("-a", "--anim",
|
|
action="store_true",
|
|
help="""skip most animations images (containing:
|
|
-attack -defend -melee -ranged -magic -idle
|
|
-die -dying -death -healing -flying -leading)"""
|
|
)
|
|
parser.add_argument("-s", "--suffix",
|
|
action="store_true",
|
|
help="skip images with directional or numerical suffix"
|
|
)
|
|
parser.add_argument("-r", "--regex",
|
|
action="store",
|
|
metavar="REG",
|
|
help="""skip images matching the case-insensitive
|
|
regular expression REG (Python)"""
|
|
)
|
|
parser.add_argument("-f", "--format",
|
|
action="store_true",
|
|
help="skip images which are not in 72x72 format"
|
|
)
|
|
parser.add_argument("-q", "--quiet",
|
|
action="store_true",
|
|
help="only display results"
|
|
)
|
|
parser.add_argument("dirs",
|
|
action="store",
|
|
nargs="*",
|
|
help="directories to check",
|
|
default=os.getcwd()
|
|
)
|
|
args=parser.parse_args()
|
|
|
|
# get all the PNG images
|
|
images = []
|
|
for folder in args.dirs:
|
|
for root, dirs, files in os.walk(folder):
|
|
for filename in files:
|
|
if filename.lower().endswith(".png"):
|
|
images.append(os.path.join(root, filename))
|
|
|
|
# remove files matching the regexs
|
|
if args.anim:
|
|
images = [elem for elem in images if not anim_re.match(elem)]
|
|
if args.suffix:
|
|
images = [elem for elem in images if not suffix_re.match(elem)]
|
|
if args.regex:
|
|
images = [elem for elem in images if not re.match(args.regex, elem)]
|
|
|
|
images.sort()
|
|
|
|
if not args.quiet:
|
|
print("""Search 72x72 images not fitting in a hex
|
|
in directories: {}
|
|
Using alphamask image: {}
|
|
Skipping files matching regex: {}
|
|
Pixels out of hex : filename""".format(", ".join(args.dirs),
|
|
args.mask if args.mask else "",
|
|
args.regex if args.regex else ""))
|
|
|
|
# open the mask
|
|
if args.mask:
|
|
try:
|
|
mask = Image.open(args.mask)
|
|
except OSError:
|
|
print("cannot read mask file {}, exiting".format(args.mask), file=sys.stderr)
|
|
sys.exit(1)
|
|
else:
|
|
mask = Image.open(BytesIO(base64.b64decode(default_mask)))
|
|
mask_data = mask.getdata(3) # get alpha channel values
|
|
|
|
for fn in images:
|
|
try:
|
|
img = Image.open(fn)
|
|
except OSError:
|
|
print("cannot read file {}, skipping".format(fn), file=sys.stderr)
|
|
continue
|
|
|
|
# check if the image size is incorrect first
|
|
if img.size != (72, 72):
|
|
if args.format:
|
|
continue
|
|
else:
|
|
px = -1
|
|
else:
|
|
px = 0
|
|
|
|
comp = Image.alpha_composite(img, mask)
|
|
|
|
# compare the alpha channel pixel by pixel
|
|
# this was the method used by the Bash version
|
|
comp_data = comp.getdata(3)
|
|
for i, mask_alpha in enumerate(mask_data):
|
|
if comp_data[i] != mask_alpha:
|
|
px += 1
|
|
|
|
if px != 0:
|
|
print("{:d}\t: {}".format(px, fn))
|
|
|
|
sys.exit(0)
|