Объедините файлы, используя подушку и Python - PullRequest
0 голосов
/ 05 июня 2018
  1. Мне нужно запустить скрипт Python внутри папки.
  2. Количество файлов скриптов (изображений) создает изображение для каждых 64 изображений.пример: если в папке, содержащей 640 изображений, я получу 10 изображений в комбинации из 64 изображений / outputimage

, просто перед тем, как добавить инструкцию «для», я могу получить результат, но вручную и толькос тем же изображением (дублирование изображения).

есть идеи?

, поэтому я действую следующим образом:

import os
import os.path

from PIL import Image

list = os.listdir(".")  # current directory 
number_files = len(list)
print (number_files)

for x in range(0, number_files):

    # files = ['x.png']  

        # opens an image: here I can't find how 
    im = Image.open("1.png") # here I tried to 

# creates a new empty image, RGB mode, and size 800 by 800.
new_im = Image.new('RGB', (800, 800))

# Here I resize my opened image, so it is no bigger than 100,100
im.thumbnail((100, 100))
# Iterate through a 8 by 8 grid with 100 spacing, to place my image
for i in xrange(0, 800, 100):
    for j in xrange(0, 800, 100):
        # paste the image at location i,j:
        new_im.paste(im, (i, j))
        new_im.save(os.path.expanduser('outputimage.png'))

обновление:

import os
import os.path

from PIL import Image


def drange(start, stop, step):
    while start < stop:
        yield start
        start += step


list = os.listdir(".")  # directory path
number_files = len(list)
print (number_files)

new_im = Image.new('RGB', (800, 800))

for x in drange(0, number_files, 64):

    im = Image.open(list[x])
    im.thumbnail((100, 100))

    for i in xrange(0, 800, 100):
        for j in xrange(0, 800, 100):

            new_im.paste(im, (i, j))

new_im.save(os.path.expanduser('out.png'))

другое обновление на основе решения Sven:

import os.path

from PIL import Image

fileList = [] where_to_look = "png/" 
  for f in os.listdir(where_to_look):
        if os.path.isfile(os.path.join(where_to_look, f)):
            fileList.append(f)
             print (len(fileList))


target_img = None n_targets = 0 collage_saved = False

for n in range(len(fileList)):
    img = Image.open(fileList[n])
    img.thumbnail((100, 100))

    if n % 64 == 0:
        # create an empty image for a collage
        target_img = Image.new("RGB", (800, 800))
        n_targets += 1
        collage_saved = False

    # paste the image at the correct position
    i = int(n / 8)
    j = n % 8
    target_img.paste(img, (100*i, 100*j))

    if (n + 1) % 64 == 0 and target_img is not None:
        # save a finished 8x8 collage
        target_img.save("{0:04}.png".format(n_targets))
        collage_saved = True

# save the last collage if not collage_saved:
    target_img.save("{0:04}.png".format(n_targets))

1 Ответ

0 голосов
/ 05 июня 2018

На основании вашего обновления я быстро набросал решение.Пожалуйста, помните, что я не проверял это:

import os
from PIL import Image

image_dir = os.path.abspath("png")
# list all files in directory
files = os.listdir(image_dir)
# get all PNGs
png_files = filter(lambda x: x.endswith(".png"), files)
# make file paths absolute
image_files = map(lambda x: os.sep.join([image_dir, x]), png_files)

n_files = len(image_files)

target_img = None
n_targets = 0
collage_saved = False
for n in range(n_files):
    img = Image.open(image_files[n])
    img.thumbnail((100, 100))

    if n % 64 == 0:
        # create an empty image for a collage
        target_img = Image.new("RGB", (800, 800))
        n_targets += 1
        collage_saved = False

    # paste the image at the correct position
    i = int(n / 8)
    j = n % 8
    target_img.paste(img, (100*i, 100*j))

    if (n + 1) % 64 == 0 and target_img is not None:
        # save a finished 8x8 collage
        target_img.save("{0:04}.png".format(n_targets))
        collage_saved = True

# save the last collage
if not collage_saved:
    target_img.save("{0:04}.png".format(n_targets))

Это будет перебирать все ваши изображения и собирать их в сетку 8x8 (я называю это коллажем в сценарии).Всякий раз, когда сетка заполнена, коллаж сохраняется в виде файла с шаблоном именования 0001.png, 0002.png и т. Д.

Обратите внимание, что есть некоторые моменты, которые необходимо улучшить:

  1. os.listdir(".") выдаст вам все файлы в каталоге, а не только изображения.Вам придется отфильтровать вывод для файлов изображений.
  2. Это работает только в текущем рабочем каталоге.
  3. Вывод также сохраняется в текущем рабочем каталоге.

ОБНОВЛЕНИЕ: фильтровать PNG и использовать абсолютные пути

...