view bin/recompress @ 94:9790bc126ea6

Epic simplified error handling in true try/except/finally spirit.
author Edho Prima Arief <edho@myconan.net>
date Thu, 14 Jul 2011 00:49:33 +0700
parents 4f954c1e2fdc
children a5324d2cc0eb
line wrap: on
line source

#!/usr/bin/env python

import sys, os
from PIL import Image


# return codes:
# 0 = ok
# 1 = error opening file (not an image, not a file, unreadable or whatever)
# 2 = error saving file (no write permission)
# 3 = not a png file
def repng(filename):
  im = Image.open(filename)
  if im.format == "PNG":
    im.save(filename, "PNG", optimize=1)
  else:
    raise Exception("Not a PNG image file")

def hbytes(inbyte):
  units = ["B", "kB", "MB", "GB", "TB", "PB"] 
  outbyte = float(inbyte)
  current_unit = 0
  while outbyte > 1000:
    outbyte /= 1000
    current_unit += 1
  return "%.2f %s" % (outbyte, units[current_unit])

if __name__ == "__main__":
  for filename in sys.argv[1:]:
    print "Recompressing %s:" % filename,
    sys.stdout.flush()
    try:
      byte_orig = os.path.getsize(filename)
      repng(filename)
      byte_new = os.path.getsize(filename)
      print "OK (%s => %s, %.2f%% saving)" % (hbytes(byte_orig), hbytes(byte_new), (byte_orig - byte_new)*100/float(byte_orig)),
      re = 0
    except:
      print "Failed",
      print "(%s: %s)" % (sys.exc_type, sys.exc_value),
      re = 1
    finally:
      print "[%s]" % re