Я думаю, что вы пытаетесь сделать, может быть решена в общем виде, используя сопрограммы, как описано в PEP 342 — Coroutines via Enhanced Generators. Ниже приведен код, который обрабатывает создание и раскладывание миниатюр на сетку любого размера. Это потенциально создает несколько эскизов страниц, в зависимости от того, сколько изображений есть и сколько будет вписываться в сетку, пока она не будет заполнена.
Я старался избегать использования жестко закодированных чисел, чтобы увеличить его гибкость. И размер эскиза, и макет сетки теперь являются переменными.
Примечание: Все вызовы, которые фактически создавали и сохраняли бы выходные изображения эскизов, были прокомментированы, чтобы упростить и ускорить выполнение в тестовом режиме. Вам нужно будет раскомментировать их, чтобы заставить их создавать любые выходные изображения.
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()
Вот вывод из вышесказанного, которая производит 3 страниц эскизов из 37 фиктивных файлов изображений высвобождаемых из на платформе 3x6 сетки:
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
Непонятно, чего вы ожидаете. Что происходит не так? И как вы ожидаете этого. – rfkortekaas
Я итерации к изображениям каталога. Я хочу, чтобы с этих образов создавалось холст 3х6. Каждое изображение должно быть другим изображением. Бок о бок. @rfkortekaas –
Но в чем проблема, которая у вас есть? Являются ли изображения не в том месте, есть ли ошибка? – rfkortekaas