#!/usr/bin/env python # -*- python -*- # # Python Thumbnail image generator # import os import sys import re import imghdr from getopt import getopt from StringIO import StringIO from PIL import Image # Require PIL module. class ThumbnailGenerator: "Thumbnail image generator." default_geom = (100, 100) geomfmt = re.compile('(?P<W>\d+)x(?P<H>\d+)') def __init__(self): self.limit_geom = self.default_geom self.outd = '.' self.suf = '-thumb' def setoutdir(self, outd): self.outd = outd def setsuffix(self, suf): self.suf = suf def setbasesize(self, geom): matched = self.geomfmt.match(geom) if not matched: raise ValueError, 'Geometory format is not "XxY"' self.limit_geom = (int(matched.group('W')), int(matched.group('H'))) def generate(self, fn, fp=None): "Generate thumbnail." im = Image.open(fn) im.thumbnail(self.limit_geom) base, ext = os.path.splitext(fn) if fp: im.save(fp, imghdr.what(fn)) else: im.save(os.path.join(self.outd, '%s%s%s'%(base, self.suf, ext))) return im def raw_generate(self, fn): "Generate thumbnail (retruns rawdata)" im = Image.open(fn) im.thumbnail(self.limit_geom) buf = StringIO() im.save(buf, imghdr.what(fn)) return buf.getvalue() def __usage(): print >>sys.stderr, 'usage: %s [options] imagefile ...' % sys.argv[0] def __help(): __usage() print '''options: -b XxY base thumbnail size -h print this usage -o directory output directory -s suffix thumbnail suffix''' def __main(): optdic = {} arglist = [] optlist = [] tmp = sys.argv[1:] while 1: opts, tmp = getopt(tmp, 'b:ho:s:') if opts: optlist += opts if not tmp: break arglist.append(tmp[0]) tmp = tmp[1:] # Examine options and filenames. if optlist: for key, val in optlist: if key == '-h': __help() return if optdic.has_key(key): raise ValueError, '%s option duplicated' % key optdic[key] = val if not arglist: __usage() return generator = ThumbnailGenerator() if optdic.has_key('-b'): generator.setbasesize(optdic['-b']) if optdic.has_key('-o'): generator.setoutdir(optdic['-o']) if optdic.has_key('-s'): generator.setsuffix(optdic['-s']) # Generate thumbnails. for fn in arglist: generator.generate(fn) if __name__ == '__main__': try: __main() except Exception, e: print >>sys.stderr, e __usage() sys.exit(1) sys.exit(0)