You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.4 KiB
63 lines
2.4 KiB
#!/usr/bin/python2.7
|
|
from __future__ import division
|
|
import os, sys
|
|
from PIL import Image
|
|
from PIL import ImageEnhance
|
|
import argparse
|
|
CROP_DEFAULT = 'default'
|
|
CROP_WHITESPACE = 'whitespace'
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--width", type=int)
|
|
parser.add_argument("--height", type=int)
|
|
parser.add_argument("--crop", choices=[CROP_WHITESPACE, CROP_DEFAULT])
|
|
parser.add_argument("--enhance", action="store_true")
|
|
parser.add_argument("source", type=str)
|
|
parser.add_argument("destination", type=str)
|
|
args = parser.parse_args()
|
|
|
|
infile = args.source
|
|
outfile = args.destination
|
|
try:
|
|
im = Image.open(infile)
|
|
format = im.format
|
|
im = im.convert()
|
|
if args.width is not None or args.height is not None:
|
|
if args.width is None:
|
|
if args.crop and args.crop == CROP_WHITESPACE:
|
|
size = (int(im.size[0]), args.height)
|
|
else:
|
|
size = (int(im.size[0] * args.height / im.size[1]), args.height)
|
|
elif args.height is None:
|
|
if args.crop and args.crop == CROP_WHITESPACE:
|
|
size = (args.width, int(im.size[1]))
|
|
else:
|
|
size = (args.width, int(im.size[1] * args.width / im.size[0]))
|
|
else:
|
|
size = (args.width, args.height)
|
|
if args.crop:
|
|
if args.crop == CROP_DEFAULT:
|
|
width_crop = im.size[0]
|
|
height_crop = int(im.size[0]/(size[0]/size[1]))
|
|
x = 0
|
|
y = int((im.size[1]-height_crop)/2)
|
|
if height_crop > im.size[1]:
|
|
width_crop = int(im.size[1]/(size[1]/size[0]))
|
|
height_crop = im.size[1]
|
|
x = int((im.size[0]-width_crop)/2)
|
|
y = 0
|
|
im = im.crop((x, y, width_crop+x, height_crop+y))
|
|
im.thumbnail(size, Image.ANTIALIAS)
|
|
if args.crop == CROP_WHITESPACE:
|
|
im_whitespace = Image.new('RGB', (size[0], size[1]), (255, 255, 255))
|
|
im_whitespace.paste(im, ((size[0] - im.size[0]) // 2, (size[1] - im.size[1]) // 2))
|
|
im = im_whitespace
|
|
else:
|
|
im.thumbnail(size, Image.ANTIALIAS)
|
|
if args.enhance:
|
|
enhancer = ImageEnhance.Contrast(im)
|
|
im = enhancer.enhance(1.05)
|
|
im.save(outfile, format, quality=100)
|
|
except IOError as e:
|
|
print("cannot create thumbnail for '%s'" % infile)
|
|
print "I/O error({0}): {1}".format(e.errno, e.strerror)
|
|
sys.exit(os.EX_DATAERR)
|