在网格中写入包含多个图像的文件

时间:2013-11-18 01:36:10

标签: python image grid

我正在尝试在10x10网格中编写包含多个图像(100)的文件。我使用3进行迭代:

- 打开文件 -set coordinates(i,j)

问题是当我查看我的文件时,我所能看到的是最后一次图像多次。每次程序进入for循环时,文件都可能会被覆盖。直到现在我找不到解决方案。

代码是:

    import Image

    from os import listdir
    from os.path import isfile, join
    files = [ f for f in listdir("/mnt/hgfs/Documents/Notebooks/test1/") if isfile(join("/mnt/hgfs/Documents/Notebooks/test1/", f)) ]

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

    for i in xrange(0,3000,300):
        for j in xrange(0,3000,300):
            for ima in files:
                #paste the image at location i,j:
                im = Image.open(ima)
                im.thumbnail((300,300))
                new_im.paste(im, (i,j))

    new_im.save("hola.png")

谢谢!

2 个答案:

答案 0 :(得分:5)

这是一个简单的错误修复。你只需要两个for循环,而不是三个。

import Image

from os import listdir
from os.path import isfile, join
files = [ f for f in listdir("/mnt/hgfs/Documents/Notebooks/test1/") if isfile(join("/mnt/hgfs/Documents/Notebooks/test1/", f)) ]

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

index = 0
for i in xrange(0,3000,300):
    for j in xrange(0,3000,300):
        im = Image.open(files[index])
        im.thumbnail((300,300))
        new_im.paste(im, (i,j))
        index += 1

new_im.save("hola.png")

答案 1 :(得分:0)

这是Python 3代码,可使用 matplotlib 从任何包含图像的目录中创建图像文件的正方形网格。 正方形尺寸会根据现有图像的数量动态计算。

import math
import os
import matplotlib.pyplot as plt

# Config:
images_dir = './your_dir_with_images'
result_grid_filename = './grid.jpg'
result_figsize_resolution = 40 # 1 = 100px

images_list = os.listdir(images_dir)
images_count = len(images_list)
print('Images: ', images_list)
print('Images count: ', images_count)

# Calculate the grid size:
grid_size = math.ceil(math.sqrt(images_count))

# Create plt plot:
fig, axes = plt.subplots(grid_size, grid_size, figsize=(result_figsize_resolution, result_figsize_resolution))

current_file_number = 0
for image_filename in images_list:
    x_position = current_file_number % grid_size
    y_position = current_file_number // grid_size

    plt_image = plt.imread(images_dir + '/' + images_list[current_file_number])
    axes[x_position, y_position].imshow(plt_image)
    print((current_file_number + 1), '/', images_count, ': ', image_filename)

    current_file_number += 1

plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0)
plt.savefig(result_grid_filename)

Images in the directory screenshot

result grid image file