added webp conversion

This commit is contained in:
2022-01-28 12:16:31 +01:00
parent 1526f7e217
commit 485a2352c3

View File

@@ -14,63 +14,42 @@ def compressor(file, final_path, quality, resize, size):
# open image # open image
with Image.open(filepath) as image: with Image.open(filepath) as image:
# resize and compress landscape images cover = image
if resize and image.width >= size and image.width >= image.height: # resize
# resize if resize:
print('resizing: ' + file) print('resizing:' + file)
cover = resizeimage.resize_width(image, size) if cover.width >= size and cover.width >= cover.height:
# convert to 8 bit (if possible) cover = resizeimage.resize_width(cover, size)
print('converting to 8 bit: ' + file) elif cover.height >= size and cover.height >= cover.width:
if cover.format in ['JPG', 'JPEG']: cover = resizeimage.resize_height(cover, size)
# TODO: JPG + JPEG are not converted to 8 bit
cover = cover.quantize(colors=256, method=2).convert("RGB") # convert to 8 bit (if possible)
else: print('converting to 8 bit: ' + file)
cover = cover.quantize(colors=256, method=2) if cover.format in ['JPG', 'JPEG']:
# compress and save # TODO: JPG + JPEG are not converted to 8 bit
print('compressing: ' + file) cover = cover.quantize(colors=256, method=2).convert("RGB")
cover.save(
str(final_path) + '/' + 'min-' + file,
image.format,
optimize=True,
quality=quality,
)
# resize and compress portrait images
elif resize and image.height >= size and image.height >= image.width:
# resize
print('resizing: ' + file)
cover = resizeimage.resize_height(image, size)
# convert to 8 bit (if possible)
print('converting to 8 bit: ' + file)
if cover.format in ['JPG', 'JPEG']:
# TODO: JPG + JPEG are not converted to 8 bit
cover = cover.quantize(colors=256, method=2).convert("RGB")
else:
cover = cover.quantize(colors=256, method=2)
# compress and save
print('compressing: ' + file)
cover.save(
str(final_path) + '/' + 'min-' + file,
image.format,
optimize=True,
quality=quality,
)
# compress images
else: else:
# convert to 8 bit (if possible) cover = cover.quantize(colors=256, method=2)
print('converting to 8 bit: ' + file)
if image.format in ['JPG', 'JPEG']: # compress and save
# TODO: JPG + JPEG are not converted to 8 bit print('compressing: ' + file)
image = image.quantize(colors=256, method=2).convert("RGB") cover.save(
else: str(final_path) + '/' + 'min-' + file,
image = image.quantize(colors=256, method=2) image.format,
# compress and save optimize=True,
print('compress: ' + file) quality=quality,
image.save( )
str(final_path) + "/" + "min-" + file,
image.format,
optimize=True, def convert_to_webp(file, final_path):
quality=quality, filepath = os.path.join(final_path, file)
)
with Image.open(filepath) as image:
print('converting to webp: ' + file)
image.save(
str(final_path) + '/' + os.path.splitext(file)[0] + '.webp',
format="WEBP"
)
def usage(): def usage():
@@ -78,6 +57,7 @@ def usage():
print('Compress and optionally resize all images (jpg|jpeg|png|webp|gif) in the current folder') print('Compress and optionally resize all images (jpg|jpeg|png|webp|gif) in the current folder')
print(' -h | --help Prints this help') print(' -h | --help Prints this help')
print(' -r | --resize Set this to resize the images') print(' -r | --resize Set this to resize the images')
print(' -c | --convert Set this to convert images to WEBP')
print(' -q | --quality QUALITY Specify the quality (1-100, default 80)') print(' -q | --quality QUALITY Specify the quality (1-100, default 80)')
print(' -s | --size SIZE Specify the size of the long side (default 900)') print(' -s | --size SIZE Specify the size of the long side (default 900)')
@@ -85,7 +65,7 @@ def usage():
def main(argv): def main(argv):
# save arguments and options to variables # save arguments and options to variables
try: try:
opts, args = getopt.getopt(argv, 'hrq:s:', ['help', 'resize', 'quality=', 'size=']) opts, args = getopt.getopt(argv, 'hrcq:s:', ['help', 'resize', 'convert', 'quality=', 'size='])
except getopt.GetoptError as err: except getopt.GetoptError as err:
print(err) print(err)
usage() usage()
@@ -94,6 +74,7 @@ def main(argv):
# default values # default values
quality_img = 80 quality_img = 80
resize = False resize = False
convert = False
size = 900 size = 900
# parse arguments # parse arguments
@@ -102,13 +83,12 @@ def main(argv):
usage() usage()
sys.exit() sys.exit()
elif o in ('-r', '--resize'): elif o in ('-r', '--resize'):
print(o)
resize = True resize = True
elif o in ('-c', '--convert'):
convert = True
elif o in ('-q', '--quality'): elif o in ('-q', '--quality'):
print(o, a)
quality_img = int(a) quality_img = int(a)
elif o in ('-s', '--size'): elif o in ('-s', '--size'):
print(o, a)
size = int(a) size = int(a)
else: else:
assert False, 'unhandled option' assert False, 'unhandled option'
@@ -120,7 +100,7 @@ def main(argv):
try: try:
# if save directory exists # if save directory exists
if 'compress' in os.listdir(): if directory_name in os.listdir():
pass pass
else: else:
# if save directory does not exist # if save directory does not exist
@@ -129,16 +109,19 @@ def main(argv):
except Exception as e: except Exception as e:
print(e) print(e)
# only support these 4 formats
formats = ('.jpg', '.jpeg', '.png', '.webp', '.gif')
# get all files # get all files
for file in os.listdir(os.getcwd()): for file in os.listdir(os.getcwd()):
# check file and compress file # check file and compress file
if os.path.splitext(file)[1].lower() in formats: if os.path.splitext(file)[1].lower() in ('.jpg', '.jpeg', '.png', '.webp', '.gif'):
# call compress function # call compress function
compressor(file, final_path, quality_img, resize, size) compressor(file, final_path, quality_img, resize, size)
# convert to webp
if convert:
for file in os.listdir(final_path):
if os.path.splitext(file)[1].lower() in ('.jpg', '.jpeg', '.png', '.gif'):
convert_to_webp(file, final_path)
print("Done") print("Done")