45 строки
1.3 KiB
Python
45 строки
1.3 KiB
Python
#!/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)
|