#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os import getopt from PIL import Image from pixelate import pixelate from resizeimage import resizeimage def compressor(file, final_path, quality, resize, size): # get filepath of image filepath = os.path.join(os.getcwd(), file) # open image with Image.open(filepath) as image: # resize and compress landscape images if resize and image.width >= size and image.width >= image.height: # resize print('resizing: ' + file) cover = resizeimage.resize_width(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, ) # 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: # convert to 8 bit (if possible) print('converting to 8 bit: ' + file) if image.format in ['JPG', 'JPEG']: # TODO: JPG + JPEG are not converted to 8 bit image = image.quantize(colors=256, method=2).convert("RGB") else: image = image.quantize(colors=256, method=2) # compress and save print('compress: ' + file) image.save( str(final_path) + "/" + "min-" + file, image.format, optimize=True, quality=quality, ) def usage(): print(f'Usage: {os.path.basename(__file__)} [-h|--help] [-r|--resize] [-q|--quality QUALITY] [-s|--size SIZE]') print('Compress and optionally resize all images (jpg|jpeg|png|webp|gif) in the current folder') print(' -h | --help Prints this help') print(' -r | --resize Set this to resize the images') print(' -q | --quality QUALITY Specify the quality (1-100, default 80)') print(' -s | --size SIZE Specify the size of the long side (default 900)') def main(argv): # save arguments and options to variables try: opts, args = getopt.getopt(argv, 'hrq:s:', ['help', 'resize', 'quality=', 'size=']) except getopt.GetoptError as err: print(err) usage() sys.exit(2) # default values quality_img = 80 resize = False size = 900 # parse arguments for o, a in opts: if o in ('-h', '--help'): usage() sys.exit() elif o in ('-r', '--resize'): print(o) resize = True elif o in ('-q', '--quality'): print(o, a) quality_img = int(a) elif o in ('-s', '--size'): print(o, a) size = int(a) else: assert False, 'unhandled option' # save directory name directory_name = 'compress' # save directory name and full path final_path = f"{os.getcwd()}/{directory_name}" try: # if save directory exists if 'compress' in os.listdir(): pass else: # if save directory does not exist # create save directory os.mkdir(final_path) except Exception as e: print(e) # only support these 4 formats formats = ('.jpg', '.jpeg', '.png', '.webp', '.gif') # get all files for file in os.listdir(os.getcwd()): # check file and compress file if os.path.splitext(file)[1].lower() in formats: # call compress function compressor(file, final_path, quality_img, resize, size) print("Done") # Driver code if __name__ == "__main__": main(sys.argv[1:])