Вопрос по image, python, canvas – Как вы объединяете изображения в холст, используя PIL / Pillow?

40

Я не знаком с PIL, но я знаю, что очень легко поместить группу изображений в сетку в ImageMagick.

Как, например, поместить 16 изображений в сетку 4 × 4, где я могу указать разрыв между строками и столбцами?

Ваш Ответ

2   ответа
2

я написал программу, которая берет в папку (.png) изображения, количество пикселей для ширины коллажа и количество изображений в строке, и выполняет все расчеты за вас. ,

#Evan Russenberger-Rosica
#Create a Grid/Matrix of Images
import PIL, os, glob
from PIL import Image
from math import ceil, floor

PATH = r"C:\Users\path\to\images"

frame_width = 1920
images_per_row = 5
padding = 2

os.chdir(PATH)

images = glob.glob("*.png")
images = images[:30]                #get the first 30 images

img_width, img_height = Image.open(images[0]).size
sf = (frame_width-(images_per_row-1)*padding)/(images_per_row*img_width)       #scaling factor
scaled_img_width = ceil(img_width*sf)                   #s
scaled_img_height = ceil(img_height*sf)

number_of_rows = ceil(len(images)/images_per_row)
frame_height = ceil(sf*img_height*number_of_rows) 

new_im = Image.new('RGB', (frame_width, frame_height))

i,j=0,0
for num, im in enumerate(images):
    if num%images_per_row==0:
        i=0
    im = Image.open(im)
    #Here I resize my opened image, so it is no bigger than 100,100
    im.thumbnail((scaled_img_width,scaled_img_height))
    #Iterate through a 4 by 4 grid with 100 spacing, to place my image
    y_cord = (j//images_per_row)*scaled_img_height
    new_im.paste(im, (i,y_cord))
    print(i, y_cord)
    i=(i+scaled_img_width)+padding
    j+=1

new_im.show()
new_im.save("out.jpg", "JPEG", quality=80, optimize=True, progressive=True)

Model Collapse Collage

Спасибо за ваш ответ. Конечно, я понял, что такое аргумент padding, но установка его на 0 не работает для меня. Любопытно, что на моем окончательном изображении появляются только вертикальные отступы. Возможно, мне следует открыть новый вопрос.
Привет. Ваш ответ выглядит великолепно. Знаете ли вы, как избежать этих черных линий на границах изображений?
@IrbinB. Когда я писал это, я хотел, чтобы разделение между изображениями было четким, поэтому я добавил горизонтальные и вертикальные отступы (черные линии). Вертикальное заполнение задается аргументом заполнения в коде, поэтому просто установите его равным 0, чтобы удалить их. Горизонтальные отступы были случайно жестко запрограммированы, и я оставил их, потому что хотел этого эффекта. Я должен поэкспериментировать, чтобы выяснить, как убрать горизонтальную прокладку; что-то отключается на 1 пиксель в каждом цикле.
@IrbinB. попробуйте изменить:scaled_img_height = ceil(img_height*sf) вscaled_img_height = floor(img_height*sf), Это должно удалить горизонтальные линии. Например, я взял 30 экземпляров одной картины (imgur.com/a/AtyrAR5) и скормил их в измененную программу и получил:imgur.com/a/kbdga0G
Это не сработало. Но я уже решил свою проблему. Я обнаружил, что проблема связана с моим файлом изображения. Таким образом, это не было проблемой с вашим кодом. Благодарю.
78

PIL тоже. Создайте пустое изображение и просто вставьте нужные изображения в любые нужные вам места.вставить, Вот краткий пример:

import Image

#opens an image:
im = Image.open("1_tree.jpg")
#creates a new empty image, RGB mode, and size 400 by 400.
new_im = Image.new('RGB', (400,400))

#Here I resize my opened image, so it is no bigger than 100,100
im.thumbnail((100,100))
#Iterate through a 4 by 4 grid with 100 spacing, to place my image
for i in xrange(0,500,100):
    for j in xrange(0,500,100):
        #I change brightness of the images, just to emphasise they are unique copies.
        im=Image.eval(im,lambda x: x+(i+j)/30)
        #paste the image at location i,j:
        new_im.paste(im, (i,j))

new_im.show()

enter image description here

Похожие вопросы