无法将图片粘贴成正方形

时间:2019-12-15 12:45:39

标签: python image for-loop python-imaging-library paste

我无法实现以正方形形式粘贴图像(如果我为n_album选择9,则应该有3x3的拼贴画)。它仅适用于1x1,如果更多,它将在同一张图片上粘贴同一张图片。

这是我的代码:

def make_montage(n_album, path):
    x_offset = width    #Constant resized image width
    y_offset = height   #Constant resized image height
    c = []
    x = 0
    img = Image.new('RGB', (n_album*height + y_offset*2, n_album*width + x_offset*2), color = (0, 0, 0))

    for file_name in os.listdir(path):
        print(f"Processing {file_name}")
        c.append(file_name)

    print(f"root of n_album = {int(math.sqrt(n_album))}")
    #Loop in square
    for i in range(int(math.sqrt(n_album))):
        for j in range(int(math.sqrt(n_album))):
            try:
                cover = Image.open(os.path.join(path, c[i + j]))
                print(f"Pasting {str(c[i + j])}")
                img.paste(cover, (int(i * height + y_offset), int(j * width + x_offset)))
            except:
                print("Je code mal mdr")

    img.save(f'{path}\\{n_album}x{n_album}_musical.png')

    #Clean
    for file_name in os.listdir(path):
        if file_name != f'{n_album}x{n_album}_musical.png':
            print(f"Deleting {file_name}")
            os.remove(os.path.join(path, file_name))

这是一个2x2的结果,其中包含(应该粘贴的顺序)图像:链接,马里奥,塞尔达公主,桃子。

Result

1 个答案:

答案 0 :(得分:1)

我在您的代码中看到了几个问题:

  • 在方法声明中,您还应该传递(期望的)每个图像的宽度和高度。 (按原样,您的方法假设widthheight在外部正确设置。)这还有一个优点,您可以在循环中即时调整图像大小。

  • 您无需关注何时使用n_album和何时使用int(math.sqrt(n_album))。 (请参见2x2蒙太奇:您显然已初始化了4x4蒙太奇。)对于后者,请创建一个n_per_axis之类的变量,这样就不必一直使用math.sqrt这个术语。

    < / li>
  • 在嵌套循环中,您有i = 1, 2, 3j = 1, 2, 3。这样,使用c[i + j]并不是从c访问正确图像的正确方法。 (在您的2x2蒙太奇中,您得到(0 + 1)= 1和(1 + 0)= 1,因此两次Mario。)设置一个(全局)图像计数器(假设k)并递增每次进入内循环时都会显示它。

  • 如果不是您要问的重点,请不要发布包括删除文件在内的代码。

这是经过一些修改的代码:

def make_montage(n_album, path, width, height):         # <-- Width, height!?
    x_offset = width
    y_offset = height
    c = []
    n_per_axis = int(math.sqrt(n_album))
    img = Image.new('RGB',
                    (n_per_axis*height + y_offset*2,    # <-- n per axis!?
                     n_per_axis*width + x_offset*2),    # <-- n per axis!?
                    color=(0, 0, 0))

    for file_name in os.listdir(path):
        print(f"Processing {file_name}")
        c.append(file_name)

    print(f"root of n_album = {n_per_axis}")
    # Loop in square
    k = -1                                          # <-- Image counter
    for i in range(n_per_axis):
        for j in range(n_per_axis):
            k += 1
            try:
                cover = Image.open(os.path.join(path, c[k]))\
                    .resize((width, height))        # <-- Might be omitted here
                print(f"Pasting {str(c[k])}")
                img.paste(cover,
                          (int(i * height + y_offset),
                           int(j * width + x_offset)))
            except:
                print("Je code mal mdr")

    img.save(f'{path}\\{n_per_axis}x{n_per_axis}_musical.png')  # <-- n per axis!?

    for file_name in os.listdir(path):
        if file_name != f'{n_per_axis}x{n_per_axis}_musical.png':
            print(f"Deleting {file_name}")
            #os.remove(os.path.join(path, file_name))

使用

make_montage(9, 'path_with_nine_images/', 100, 100)

我得到以下输出:

Output

希望有帮助!