Comment ca marche?
C'est très simple: fournissez une liste d'images, éventuellement une orientation et un fichier en sortie (par défaut, il utilise output.png dans le répertoire courant) et hop, le script vous génére un collage de toutes vos images, et vous sort la CSS associée. Idéalement, ca donne:
% collage.py *.png > style.css
La CSS obtenue ressemblera a:
#i_image1 { background-image: url(output.png); background-repeat: no-repeat; background-position: -0px -0px; height: 70px; width: 200px; } #i_image2 { background-image: url(output.png); background-repeat: no-repeat; background-position: -200px -0px; height: 100px; width: 300px; }
Téléchargement et notes
Vous pouvez télecharger la version 0.1 du script ou le lire ci-dessous, ce n'est pas très long. Attention par contre: le script utilisera le mode (RGB / 8 bits / RGBA) de la première image de la liste, et tentera de convertir toutes les autres images dans ce mode. Ceci fait que si vous voulez combinez plusieurs images en 8 bits, il faut qu'elles aient la même palette, vu que seule celle de la première image sera utilisée. Il ne devrait y avoir aucun problèmes avec les images en RGB/A. J'ai essayé de contourner ce problème en travaillant en RGB pour ensuite ré-enregistrer en 8 bits, mais je n'arrive pas à générer de palette correcte lorsque j'effectue la conversion avec PIL, donc pour le moment, bah faudra faire avec cette limitation 
#!/usr/bin/python import sys import os import re from optparse import OptionParser import Image def parse_options(): parser = OptionParser(usage="Usage: %prog [options] SOURCE...", version="%prog 0.1") parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False, help="turn on verbose output [default: %default]") parser.add_option("-f", "--file", dest="filename", default="output.png", metavar="FILE", help="write output to FILE [default: %default]") parser.add_option("-o", "--orientation", dest="orientation", default="horizontal", metavar="ORIENTATION", help="set orientation to ORIENTATION [default: %default]") (options, args) = parser.parse_args() if options.orientation != "horizontal" and options.orientation != "vertical": parser.error("orientation must be 'horizontal' or 'vertical'") return (options, args) def draw_output(options, args): x = 0 y = 0 buffer = None transindex = -1 images = [] for imagename in args: # Do not include the resulting file in the process, allowing lazy people # to just use collage.py * if imagename == options.filename: continue try: image = Image.open(imagename) if options.verbose: print "Adding %s (%s, %s, %s)" % (imagename, image.size, image.mode, image.format) except IOError: print >> sys.stderr, "Error opening file '%s', moving on." % (imagename, ) continue if not buffer: # FIXME: warn the user if the other image's palettes do not match!! buffer = Image.new(image.mode, image.size, None) if image.mode == "P": if image.info and image.info.has_key('transparency'): transindex = image.info['transparency'] palette = image.getpalette() buffer.putpalette(palette) owidth = width = buffer.size[0] oheight = height = buffer.size[1] if width < image.size[0] + x: width = image.size[0] + x if height < image.size[1] + y: height = image.size[1] + y if width != owidth or height != oheight: if options.verbose: print "Need to transform buffer from %d, %d to %d, %d" % (owidth, oheight, width, height) buffer = buffer.transform((width, height), Image.EXTENT, (0, 0, width, height)) buffer.paste(image, (x, y)) images.append({'name' : imagename, 'x': x, 'y': y, 'width': image.size[0], 'height': image.size[1]}) if options.orientation == "horizontal": x += image.size[0] else: y += image.size[1] if transindex != -1: try: buffer.save(options.filename, transparency=transindex) return images except: pass try: buffer.save(options.filename) except: print >> sys.stderr, "Can't save image to %s, giving up" % (options.filename, ) sys.exit(0) return images def print_stylesheet(images, filename): for image in images: selector = os.path.splitext(os.path.basename(image['name']))[0] selector = "i_" + re.sub(r"[^A-Za-z0-9_:.-]", "", selector) print "#%s" % (selector, ) print "{" print "\tbackground-image: url(%s);" % (filename) print "\tbackground-repeat: no-repeat;" print "\tbackground-position: -%dpx -%dpx;" % (image['x'], image['y']) print "\theight: %dpx;" % (image['height']) print "\twidth: %dpx;" % (image['width']) print "}" if __name__ == "__main__": (options, args) = parse_options() images = draw_output(options, args) print_stylesheet(images, options.filename)








Commentaires
Déjà que cette technique est dure, si il y a un script Python qui vient avec ça, tout le monde va penser que les progrmmeurs sont des fainéans :D
Bravo !
Ah mais les programmeurs sont des fainéants