Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t使用循环将图像粘贴到正方形中_Python_Image_For Loop_Python Imaging Library_Paste - Fatal编程技术网

Python Can';t使用循环将图像粘贴到正方形中

Python Can';t使用循环将图像粘贴到正方形中,python,image,for-loop,python-imaging-library,paste,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

我无法实现以正方形形式粘贴图像(如果我为
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的结果,图片的顺序是:链接,马里奥,塞尔达公主,桃子


我发现您的代码中存在几个问题:

  • 在方法声明中,还应传递每个图像的(所需)宽度和高度。(同样,您的方法假设
    宽度
    高度
    在外部正确设置。)这还有一个优点,即您可以在循环中动态调整图像大小

  • 您不需要注意,何时使用
    n_相册
    以及何时使用
    int(math.sqrt(n_相册))
    。(参见您的2x2蒙太奇:您显然初始化了4x4蒙太奇。)对于后者,创建一个变量,如
    n_per_axis
    ,这样您就不会一直使用这个
    math.sqrt
    术语

  • 在嵌套循环中,有
    i=1,2,3
    j=1,2,3
    。使用
    c[i+j]
    不是从
    c
    访问正确图像的正确方法。(在你的2x2蒙太奇中,你得到(0+1)=1和(1+0)=1,所以马里奥两次。)设置一个(全局)图像计数器(比如说
    k
    ),并随着每次进入内循环而递增

  • 如果这不是你问题的重点,不要发布代码,包括删除文件

以下是经过一些修改的代码:


def make_montage(n_相册、路径、宽度、高度):#谢谢!关于调整大小,我做了另一个函数来调整我的图像文件夹中所有图像的大小