build/pypng/pipcat
author Irving Reid <irving@mozilla.com>
Wed, 04 Apr 2012 09:13:35 -0400
changeset 11568 014d81b1029f033d20453ba500b53024838e8e86
parent 8729 923b924c9422bddc54a3d8c08b765da58dddeedd
permissions -rw-r--r--
Bug 734080 - Port clang warning suppression from m-c. r=dbienvenu

#!/usr/bin/env python
# $URL: http://pypng.googlecode.com/svn/trunk/code/pipcat $
# $Rev: 77 $

# http://www.python.org/doc/2.4.4/lib/module-itertools.html
import itertools
import sys

import png

def cat(out, l):
    """Concatenate the list of images.  All input images must be same
    height and have the same number of channels.  They are concatenated
    left-to-right.  `out` is the (open file) destination for the
    output image.  `l` should be a list of open files (the input
    image files).
    """

    l = map(lambda f: png.Reader(file=f), l)
    # Ewgh, side effects.
    map(lambda r: r.preamble(), l)
    # The reference height; from the first image.
    height = l[0].height
    # The total target width
    width = 0
    for i,r in enumerate(l):
        if r.height != height:
            raise Error('Image %d, height %d, does not match %d.' %
              (i, r.height, height))
        width += r.width
    pixel,info = zip(*map(lambda r: r.asDirect()[2:4], l))
    tinfo = dict(info[0])
    del tinfo['size']
    w = png.Writer(width, height, **tinfo)
    def itercat():
        for row in itertools.izip(*pixel):
            yield itertools.chain(*row)
    w.write(out, itercat())

def main(argv):
    return cat(sys.stdout, map(lambda n: open(n, 'rb'), argv[1:]))

if __name__ == '__main__':
    main(sys.argv)