Combina múltiples imágenes diferentes de un directorio en un canvas de 3×6

I itirate a las imágenes de un directorio. Quiero que esas imágenes creen un canvas de 3×6, una nueva imagen que mostrará las imágenes de ese directorio lado a lado en una sola imagen / canvas. Cada imagen debe ser una imagen diferente. Lado a lado. –

tengo el siguiente código. Intenta leer los nombres de archivos de imágenes de un directorio que se almacenan en una lista. Luego intenta copiar / combinar cada imagen en un canvas de 3×6. Sin embargo, el resultado que quiero no pasa. que estoy haciendo mal?

import Image import os import PIL import glob import matplotlib.pyplot as plt # path path = "/media/" listing = os.listdir(path) # getting all path+filename in a list npath=[] im=[] for infile in listing: im.append(infile) npath.append(os.path.join(path, infile)) #creates a new empty image, RGB mode, and size 400 by 400. new_im = Image.new('RGB', (2100,2400)) #Here I resize my opened image, so it is no bigger than **** #Iterate through a grid with some spacing, to place my image for i in xrange(0,2100,700): for j in xrange(0,2400, 400): for imagefile in npath: im=Image.open(imagefile) im.thumbnail((1000,1000)) #paste the image at location i,j: new_im.paste(im, (i,j)) new_im.show() #saving new_im.save('/media/test.png') 

La solución

 import Image import os import PIL import glob import matplotlib.pyplot as plt # path path = "/media/" listing = os.listdir(path) # getting all path+filename in a list npath=[] im=[] for infile in listing: im.append(infile) npath.append(os.path.join(path, infile)) #creates a new empty image, RGB mode, and size 400 by 400. new_im = Image.new('RGB', (2500,3000)) for i in xrange(0,2500,800): for j in xrange(0,3000, 500): im=Image.open(npath.pop(0)) im.thumbnail((1000,1000)) #paste the image at location i,j: new_im.paste(im, (i,j)) new_im.save('/media/test.png') 

No itere sobre la lista de imágenes para cada posición, consum la lista en su lugar:

 for i in xrange(0, 2100, 700): for j in xrange(0, 2400, 400): try: filepath = npath.pop(0) except IndexError: break im = Image.open(filepath) im.thumbnail((1000,1000)) # paste the image at location i,j new_im.paste(im, (i,j)) else: continue # executed if inner loop ended normally (no break) break # executed if 'continue' was skipped (break occurred) 

Creo que lo que intenta hacer podría resolverse de una manera muy general utilizando coroutines como se describe en PEP 342 – Coroutines vía Enhanced Generators . A continuación se muestra el código para manejar la creación y distribución de imágenes en miniatura en una cuadrícula de cualquier tamaño. Potencialmente generará múltiples páginas de miniaturas, dependiendo de cuántas imágenes haya y cuántas cabrán en la cuadrícula hasta que esté llena.

Intenté evitar el uso de números codificados para boost su flexibilidad. Tanto el tamaño de la miniatura como el diseño de la cuadrícula ahora son variables.

Nota : Todas las llamadas que realmente crearían y guardarían las imágenes de salida en miniatura han sido comentadas, por lo que es fácil y rápido ejecutar en modo de prueba. Tendrá que descomentarlos para que realmente produzca imágenes de salida.

 from glob import iglob from PIL import Image import os def thumbnailer(thumbpath, grid, thumb_size, background_color): """ Coroutine to receive image file names and produce thumbnail pages of them laid-out in a grid. """ page_num = 0 page_extent = grid[0]*thumb_size[0], grid[1]*thumb_size[1] try: while True: paste_cnt = 0 #new_img = Image.new('RGB', page_extent, background_color) for x in xrange(0, page_extent[0], thumb_size[0]): for y in xrange(0, page_extent[1], thumb_size[1]): try: filepath = (yield) except GeneratorExit: print('GeneratorExit received') return filename = os.path.basename(filepath) print('{} thumbnail -> ({}, {})'.format(filename, x, y)) #thumbnail_img = Image.open(filepath) #thumbnail_img.thumbnail(thumb_size) #new_img.paste(thumbnail_img, (x,y)) paste_cnt += 1 else: continue # no break, continue outer loop break # break occurred, terminate outer loop print('====> thumbnail page completed') if paste_cnt: page_num += 1 print('Saving thumbpage{}.png'.format(page_num)) #img.save( # os.path.join(thumbpath, 'thumbpage{}.png'.format(page_num))) finally: print('====> finally') if paste_cnt: page_num += 1 print('Saving thumbpage{}.png'.format(page_num)) #img.save( # os.path.join(thumbpath, 'thumbpage{}.png'.format(page_num))) path = '/media' #npath = [infile for infile in iglob(os.path.join(path, '*.png'))] npath = ['image{}.png'.format(i) for i in xrange(1, 37+1)] # test names coroutine = thumbnailer(path, (3,6), (1000,1000), 'white') coroutine.next() # start it for filepath in npath: coroutine.send(filepath) print('====> closing coroutine') coroutine.close() 

Aquí está el resultado de lo anterior que produce 3 páginas en miniatura de los 37 archivos de imágenes ficticias distribuidos en una cuadrícula de 3×6:

 image1.png thumbnail -> (0, 0) image2.png thumbnail -> (0, 1000) image3.png thumbnail -> (0, 2000) image4.png thumbnail -> (0, 3000) image5.png thumbnail -> (0, 4000) image6.png thumbnail -> (0, 5000) image7.png thumbnail -> (1000, 0) image8.png thumbnail -> (1000, 1000) image9.png thumbnail -> (1000, 2000) image10.png thumbnail -> (1000, 3000) image11.png thumbnail -> (1000, 4000) image12.png thumbnail -> (1000, 5000) image13.png thumbnail -> (2000, 0) image14.png thumbnail -> (2000, 1000) image15.png thumbnail -> (2000, 2000) image16.png thumbnail -> (2000, 3000) image17.png thumbnail -> (2000, 4000) image18.png thumbnail -> (2000, 5000) ====> thumbnail page completed Saving thumbpage1.png image19.png thumbnail -> (0, 0) image20.png thumbnail -> (0, 1000) image21.png thumbnail -> (0, 2000) image22.png thumbnail -> (0, 3000) image23.png thumbnail -> (0, 4000) image24.png thumbnail -> (0, 5000) image25.png thumbnail -> (1000, 0) image26.png thumbnail -> (1000, 1000) image27.png thumbnail -> (1000, 2000) image28.png thumbnail -> (1000, 3000) image29.png thumbnail -> (1000, 4000) image30.png thumbnail -> (1000, 5000) image31.png thumbnail -> (2000, 0) image32.png thumbnail -> (2000, 1000) image33.png thumbnail -> (2000, 2000) image34.png thumbnail -> (2000, 3000) image35.png thumbnail -> (2000, 4000) image36.png thumbnail -> (2000, 5000) ====> thumbnail page completed Saving thumbpage2.png image37.png thumbnail -> (0, 0) ====> closing coroutine GeneratorExit received ====> finally Saving thumbpage3.png