Python37 / PIL图片。不能将图像粘贴成带正方形的正方形

问题描述 投票:0回答:1

我无法以正方形形式粘贴图像(如果我选择9具有n_album,则应该有一个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的结果,其图像为(应该粘贴的顺序);链接,马里奥,塞尔达公主,桃子“结果”

python image for-loop python-imaging-library paste
1个回答
0
投票

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

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

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

  • 在嵌套循环中,您有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

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.