123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #!/usr/bin/env python
- # $URL: http://pypng.googlecode.com/svn/trunk/code/pipscalez $
- # $Rev: 131 $
- # pipscalez
- # Enlarge an image by an integer factor horizontally and vertically.
- def rescale(inp, out, xf, yf):
- from array import array
- import png
- r = png.Reader(file=inp)
- _,_,pixels,meta = r.asDirect()
- typecode = 'BH'[meta['bitdepth'] > 8]
- planes = meta['planes']
- # We are going to use meta in the call to Writer, so expand the
- # size.
- x,y = meta['size']
- x *= xf
- y *= yf
- meta['size'] = (x,y)
- del x
- del y
- # Values per row, target row.
- vpr = meta['size'][0] * planes
- def iterscale():
- for row in pixels:
- bigrow = array(typecode, [0]*vpr)
- row = array(typecode, row)
- for c in range(planes):
- channel = row[c::planes]
- for i in range(xf):
- bigrow[i*planes+c::xf*planes] = channel
- for _ in range(yf):
- yield bigrow
- w = png.Writer(**meta)
- w.write(out, iterscale())
- def main(argv=None):
- import sys
- if argv is None:
- argv = sys.argv
- xf = int(argv[1])
- if len(argv) > 2:
- yf = int(argv[2])
- else:
- yf = xf
- return rescale(sys.stdin, sys.stdout, xf, yf)
- if __name__ == '__main__':
- main()
|