2016-07-17 3 views
1

Я итерацию к изображениям каталога. Я хочу, чтобы с этих образов создавалось холст 3x6, новое изображение, которое будет отображать изображения этого каталога бок о бок в одно изображение/холст. Каждое изображение должно быть другим изображением. Бок о бок. -Объедините несколько разных изображений из каталога в холст размером 3x6

У меня есть следующий код. Он пытается прочитать имена файлов изображений из каталога, который хранится в списке. Затем он пытается скопировать/объединить каждое изображение в холст 3x6. Однако результат, который я хочу, не происходит. Что я делаю неправильно?

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') 

Раствор

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') 
+0

Непонятно, чего вы ожидаете. Что происходит не так? И как вы ожидаете этого. – rfkortekaas

+0

Я итерации к изображениям каталога. Я хочу, чтобы с этих образов создавалось холст 3х6. Каждое изображение должно быть другим изображением. Бок о бок. @rfkortekaas –

+0

Но в чем проблема, которая у вас есть? Являются ли изображения не в том месте, есть ли ошибка? – rfkortekaas

ответ

4

Не итерацию по списку изображений для каждой позиции, потребляют список вместо:

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) 
+0

Он выдает следующую ошибку, в то время как npath ранее заполнен данными. Однако после того, как цикл пуст. 'Traceback (последний последний вызов): Файл« /usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py », строка 2820, в run_code exec code_obj в self.user_global_ns, self.user_ns File "", строка 25, в им = Image.open (npath.pop (0)) IndexError: поп из пустого list' –

+0

Да, поп потребляет список. Так что в списке достаточно изображений. Добавьте попытку catch для проверки пустого списка. – rfkortekaas

+0

. Я помещаю 18 изображений на переменные пути. Снова та же ошибка, которую я беру. –

1

Я думаю, что вы пытаетесь сделать, может быть решена в общем виде, используя сопрограммы, как описано в 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 
0

если вы хотите супер накладывать изображения в папке, используйте blend() в python.