123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #!/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)
|