Объединить несколько изображений одновременно, равномерно разделить изображение по вертикали - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть внутренняя папка с 100 изображениями, я хочу объединить их вертикально. Затем я хочу обрезать изображение равномерно. Пример 6: 800 x 1600 + 800 x 7000 + 800 x 12000 + 800 x 15000 + 800 x 25000 + 800 x 8000 = 800 x 68600

Теперь я хочу разделить изображение равномерно по размеру по вертикали и у меня есть 57 изображений с разрешением 800 x 1200 и 1 изображение: 800 x 200 с нумерацией от 1 до 58

Спасибо, что уделили мне время.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Мой код:

from PIL import Image
import cv2
import os
import glob


im1 = Image.open('1.jpg')
im2 = Image.open('2.jpg')
im3 = Image.open('3.jpg')
im4 = Image.open('4.jpg')
im5 = Image.open('5.jpg')

def get_concat_v_multi_resize(im_list, resample=Image.BICUBIC):
    min_width = min(im.width for im in im_list)
    im_list_resize = [im.resize((min_width, int(im.height * min_width / im.width)),resample=resample)
                      for im in im_list]
    total_height = sum(im.height for im in im_list_resize)
    dst = Image.new('RGB', (min_width, total_height))
    pos_y = 0
    for im in im_list_resize:
        dst.paste(im, (0, pos_y))
        pos_y += im.height
    return dst

get_concat_v_multi_resize([im1, im2, im3, im4, im5]).save('concat.jpg')

1 Ответ

0 голосов
/ 08 апреля 2020

Вы можете использовать l oop с Image.crop ((слева, сверху, справа, снизу)) , чтобы получить часть изображения и сохранить ее

from PIL import Image

img = Image.open('concat.jpg')
width, height = img.size
#print(width, height)

for i, y in enumerate(range(0, height, 1200), 1):
    # to calculate height for last image
    h = height-y
    if h > 1200:
        h = 1200
    print(i, width, h)

    cropped = img.crop( (0, y, width, y+h) )
    cropped.save(f'image{i}.jpg')

Вместо загрузки 'concat.jpg' вы можете напрямую использовать изображение dst с вашего get_concat_v_multi_resize

from PIL import Image
import glob

def get_concat_v_multi_resize(im_list, resample=Image.BICUBIC):
    min_width = min(im.width for im in im_list)
    im_list_resize = [im.resize((min_width, int(im.height * min_width / im.width)),resample=resample)
                      for im in im_list]
    total_height = sum(im.height for im in im_list_resize)
    dst = Image.new('RGB', (min_width, total_height))
    pos_y = 0
    for im in im_list_resize:
        dst.paste(im, (0, pos_y))
        pos_y += im.height
    return dst

print('reading...')
imgs = [Image.open(name) for name in glob.glob('folder/*.jpg')]

print('joining...')
img = get_concat_v_multi_resize(imgs)

print('spliting...')
width, height = img.size
#print(width, height)

for i, y in enumerate(range(0, height, 1200), 1):
    # to calculate height for last image
    h = height-y
    if h > 1200:
        h = 1200
    print(i, width, h)
    cropped = img.crop( (0, y, width, y+h) )
    cropped.save(f'image{i}.jpg')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...