2010-10-11 6 views
1

Essayer d'utiliser pil pour créer une mise en page en forme de grille à partir d'images. Mais ce code ne dessine que la première colonne. Quelqu'un peut-il m'aider?Python - PIL - Images manquantes

def draw(self): 
    image=Image.new("RGB",((IMAGE_SIZE[0]+40)*5+40,(IMAGE_SIZE[1]+20)*CHILD_COUNT+20),(255,255,255)) 
    paste_x=(-1)*IMAGE_SIZE[0] 
    paste_y=(-1)*IMAGE_SIZE[1] 
    i=0 
    for a range(5): 
     paste_x=paste_x+IMAGE_SIZE[0]+40 
     j=0 
     for b in range(4): 
      paste_y=paste_y+IMAGE_SIZE[1]+20 
      image.paste(Image.new("RGB",IMAGE_SIZE,(0,0,0)),(paste_x,paste_y)) 
      j=j+1 
     i=i+1  
    out=NamedTemporaryFile(delete=False) 
    path=out.name 
    image.save(out, "PNG") 
    out.close() 
    print path 
+2

Python + 'i = 0' + boucle 'for' +' i = i + 1' = * hurl * –

Répondre

3

Utilisez itertools.product pour itérer sur les lignes et les colonnes:

import tempfile 
import Image 
import itertools 

COLUMNS=5 
ROWS=5 
VSEP=20 
HSEP=40 
IMAGE_SIZE=(100,100) 

def draw(): 
    image=Image.new("RGB", 
        ((IMAGE_SIZE[0]+HSEP)*COLUMNS+HSEP, 
        (IMAGE_SIZE[1]+VSEP)*ROWS+VSEP), 
        (255,255,255)) 
    for row,column in itertools.product(range(ROWS),range(COLUMNS)): 
     # print(row,column) # uncomment this to see what itertools.product does 
     paste_x=HSEP+column*(IMAGE_SIZE[0]+HSEP) 
     paste_y=VSEP+row*(IMAGE_SIZE[1]+VSEP) 
     image.paste(Image.new("RGB",IMAGE_SIZE,(0,0,0)),(paste_x,paste_y)) 
    out=tempfile.NamedTemporaryFile(delete=False) 
    path=out.name 
    image.save(out, "PNG") 
    out.close() 
    print path 

draw() 

Aussi, essayez de ne pas utiliser trop de chiffres codés en dur. Si vous placez les nombres dans des variables, votre code est plus facile à modifier et réduit les erreurs potentielles.

PS. Je pense que l'erreur dans le code que vous avez posté est que vous ne réinitialisez jamais paste_y. Après avoir terminé la première colonne, la valeur de paste_y ne cesse de croître, afin que vous commenciez à coller de petites images au-delà du bord inférieur du image.

Donc, vous pouvez résoudre le problème en déplaçant paste_y=-IMAGE_SIZE[1] juste après j=0, mais je préfère encore le faire comme je l'ai montré ci-dessus.

+0

Merci. En fait, la fonction prend ses variables d'autres fonctions, je les ai enlevées pour effacer la question. C'était ma première question à stackoverflow.com, et je suis impressionné :). Merci encore. – utdemir

+0

@ user472416: Bienvenue sur stackoverflow! :) – unutbu

Questions connexes