view bin/recompress @ 346:31da7601cace

More rules.
author Edho Arief <edho@myconan.net>
date Fri, 06 Apr 2012 13:18:26 +0700
parents 97e24e89388f
children
line wrap: on
line source

#!/usr/bin/env python

import sys, os
from PIL import Image


# Raises a generic exception (exception.Exception) if input is 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])

def sane_fn(filename):
  import re
  return re.sub(r"[\x00-\x1F\x7F\n\r]", "?", filename)

def main(files):
  for filename in files:
    print "Recompressing %s:" % sane_fn(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

if __name__ == "__main__":
  main(sys.argv[1:])