flyte
10/14/2013 - 9:58 AM

Resize an image to multiple different sizes based on their long edge size.

Resize an image to multiple different sizes based on their long edge size.

from PIL import Image
import os
import argparse

p = argparse.ArgumentParser()
p.add_argument("img_filename")

sizes = {
  "thumbnail": 100,
  "small": 240,
  "small 320": 320,
  "medium": 500,
  "medium 640": 640,
  "medium 800": 800,
  "large": 1024,
  "large 1600": 1600,
  "large 2048": 2048
}

def new_size(long_edge_px, current_dimensions):
  cx, cy = current_dimensions
  if cx >= cy:
    ratio = float(cx)/float(cy)
    return (long_edge_px, int(long_edge_px/ratio))
  else:
    ratio = float(cy)/float(cx)
    return (int(long_edge_px/ratio), long_edge_px)

def resize_and_save(filename, long_edge_px, new_filename):
  print "Resizing %s to %spx and saving as %s" % (
    filename, long_edge_px, new_filename)
  img = Image.open(filename)
  img.resize(new_size(long_edge_px, img.size), Image.ANTIALIAS).save(new_filename)

if __name__ == "__main__":
  args = p.parse_args()

  for size_name, size in sizes.items():
    filename, ext = os.path.splitext(args.img_filename)
    resize_and_save(args.img_filename, size, "%s_%s%s" % (
      filename, size_name, ext))