Thread: [cgkit-commits] cgkit2/cgkit stitch.py,NONE,1.1
Brought to you by:
mbaas
From: Matthias B. <mb...@us...> - 2005-10-04 15:58:48
|
Update of /cvsroot/cgkit/cgkit2/cgkit In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20570 Added Files: stitch.py Log Message: New module --- NEW FILE: stitch.py --- #!/usr/bin/env python ########################################################################### # cgkit - Python Computer Graphics Kit # Copyright (C) 2004 Matthias Baas (ba...@ir...) # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # cgkit homepage: http://cgkit.sourceforge.net ########################################################################### # $Id: stitch.py,v 1.1 2005/10/04 15:58:35 mbaas Exp $ """Image stitching module. This file can also be used as a command line tool. """ import sys, os, os.path, glob, optparse import _Image as Image # isTile def isTile(name): """Check if a filename is the name of a tile. """ try: splitTileName(name) except ValueError: return False return True # splitTileName def splitTileName(name): """Split the components of a tile name. The return value is a tuple (basename, extension, coords) where coords is a tuple (x1,x2,y1,y2). A ValueError exception is thrown if name is not a valid tile name. """ coords = [] n,ext = os.path.splitext(name) for i in range(4): j = n.rfind("_") if j==-1: raise ValueError, "no tile name" try: coords = [float(n[j+1:])]+coords except: raise ValueError, "no tile name (invalid coordinate)" n = n[:j] return n,ext,tuple(coords) # stitch def stitch(filename, removetiles=False, infostream=None): """Stitch several image tiles together. filename is the base name of the image that determines the file names of the tiles. filename is also the name of the output image. If removetiles is True, the individual image files will be deleted after the image has been stitched. If infostream is set to a file like object it is used to output status information about the stitching process. The name of an image tile must contain the crop information that was used to create the image. For example, the name of a tile for an image "out.tif" could look like this: "out_0.0_0.5_0.75_1.0.tif". The four values are the x1,x2,y1,y2 values of the crop window. Those values together with the resolution of the tile determine the resolution of the entire image. The position of the tile within that image is given by x1,y1. """ inname,inext = os.path.splitext(filename) tilenames = glob.glob("%s*%s"%(inname,inext)) usedtilenames = [] xres = None yres = None for tilename in tilenames: # No tile at all? if not isTile(tilename): continue name,ext,coords = splitTileName(tilename) # A tile of another image? if name!=inname or ext!=inext: continue # Open the tile image... tileimg = Image.open(tilename) width, height = tileimg.size x1,x2,y1,y2 = coords xr = int(width/(x2-x1)) yr = int(height/(y2-y1)) # Is it the first tile? Then create the output image.. if xres==None: xres = xr yres = yr if infostream!=None: print >>infostream, "Final resolution: %dx%d, mode: %s"%(xres, yres, tileimg.mode) outimg = Image.new(tileimg.mode, (xres, yres)) else: # It's not the first tile, so check if the calculated resolution # and the image modes match... if xr!=xres or yr!=yres: raise ValueError, "%s: Resolution mismatch, %dx%d instead of %dx%d"%(tilename, xr, yr, xres, yres) if tileimg.mode!=outimg.mode: raise ValueError, "%s: Mode mismatch, %s instead of %s"%(tilename, tileimg.mode, outimg.mode) # Paste the tile into the output image... xpos = int(x1*xres) ypos = int(y1*yres) outimg.paste(tileimg, (xpos, ypos)) tileimg = None # Store the tile name usedtilenames.append(tilename) if len(usedtilenames)==0: if infostream!=None: print >>infostream, 'No image tiles found for image "%s"'%filename else: if infostream!=None: print >>infostream, "Stitched %d tiles"%len(usedtilenames) print >>infostream, 'Saving "%s"...'%filename outimg.save(filename) if removetiles: if infostream!=None: print >>infostream, "Removing tiles..." for tn in usedtilenames: os.remove(tn) ###################################################################### def main(): """Main function for the stitch command line tool. """ usage = "usage: %prog [options] basenames" parser = optparse.OptionParser(usage) parser.add_option("-r", "--remove-tiles", action="store_true", default=False, help="Remove the tiles after stitching") opts, args = parser.parse_args() if len(args)==0: parser.print_help() sys.exit(0) for filename in args: stitch(filename, removetiles=opts.remove_tiles, infostream=sys.stdout) ###################################################################### if __name__=="__main__": try: main() except ValueError, e: print e |