使用Pillow和Python组合文件

时间:2018-06-05 10:35:10

标签: python pillow

  1. 我需要在文件夹中运行python脚本。
  2. 脚本计数文件(图像)编号为其创建图像 每64张图片。 例如:如果包含640个图像的文件夹,我将获得10个 图像为64张图像/ outputimage的组合
  3. 只是,在添加“for”指令之前,我可以得到一个结果,但是手动并且只能使用相同的图像(图像重复)。

    任何想法?

    所以我按照以下步骤进行:

    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 :(得分:0)

根据您的更新,我快速勾勒出了一个解决方案。请注意我没有测试它:

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. 输出也会保存到当前工作目录。
  4. 更新:过滤PNG并使用绝对路径