Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/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中创建和组合大量图像-错误:打开的文件太多:_Python_Image_Python Imaging Library_Glob - Fatal编程技术网

在Python中创建和组合大量图像-错误:打开的文件太多:

在Python中创建和组合大量图像-错误:打开的文件太多:,python,image,python-imaging-library,glob,Python,Image,Python Imaging Library,Glob,所以基本上我有两个代码: 可以创建多个不同颜色的图像,尺寸为1像素 另一个将所有创建的图像合并为一个 第一个可以很好地工作,但在第二个代码中我得到一个错误:IOError:[Errno 24]打开的文件太多:“Test 3161.png” 问题是我不一定要创建这些文件。我真正想要的是最后的组合图像。我不知道该怎么做。任何帮助都将不胜感激 代码1-创建图像 from PIL import Image import sys im = Image.new("RGB", (1, 1)) pix = i

所以基本上我有两个代码:

  • 可以创建多个不同颜色的图像,尺寸为1像素

  • 另一个将所有创建的图像合并为一个

  • 第一个可以很好地工作,但在第二个代码中我得到一个错误:
    IOError:[Errno 24]打开的文件太多:“Test 3161.png”

    问题是我不一定要创建这些文件。我真正想要的是最后的组合图像。我不知道该怎么做。任何帮助都将不胜感激

    代码1-创建图像

    from PIL import Image
    import sys
    
    im = Image.new("RGB", (1, 1))
    pix = im.load()
    
    j=0
    
    for r in range(65,130):
        for g in range(65,130):
            for b in range(65,130):
                for x in range(1):
                    for y in range(1):
                        axis = (r,g,b)
                        pix[x,y] = axis
                    print axis
                    j+=1
                    im.save('Test {}.png'.format(j), "PNG")
    
    from PIL import Image
    import sys
    import glob
    
    imgfiles = []
    for file in glob.glob("*.png"):
        imgfiles.append(file)
    print imgfiles
    
    #stitching images together
    images = map(Image.open, imgfiles)
    widths, heights = zip(*(i.size for i in images))
    
    total_width = sum(widths)
    max_height = max(heights)
    
    new_im = Image.new('RGB', (total_width, max_height))
    
    x_offset = 0
    for im in images:
        new_im.paste(im, (x_offset,0))
        x_offset += im.size[0]
    
    new_im.save('test.png')
    
    代码2:组合图像

    from PIL import Image
    import sys
    
    im = Image.new("RGB", (1, 1))
    pix = im.load()
    
    j=0
    
    for r in range(65,130):
        for g in range(65,130):
            for b in range(65,130):
                for x in range(1):
                    for y in range(1):
                        axis = (r,g,b)
                        pix[x,y] = axis
                    print axis
                    j+=1
                    im.save('Test {}.png'.format(j), "PNG")
    
    from PIL import Image
    import sys
    import glob
    
    imgfiles = []
    for file in glob.glob("*.png"):
        imgfiles.append(file)
    print imgfiles
    
    #stitching images together
    images = map(Image.open, imgfiles)
    widths, heights = zip(*(i.size for i in images))
    
    total_width = sum(widths)
    max_height = max(heights)
    
    new_im = Image.new('RGB', (total_width, max_height))
    
    x_offset = 0
    for im in images:
        new_im.paste(im, (x_offset,0))
        x_offset += im.size[0]
    
    new_im.save('test.png')
    
    这是我试图获得的最终图像,但没有显示的那么多颜色:

    根据代码1创建的彩色图像是宽度和直径为1像素的图像。例如:


    它很难被看到,因为它的一个像素就在这个旁边。它看起来像一个全站仪,但它是一个有问题的1像素图像。

    要解决“打开文件过多”错误,您可以使用以下功能:

    def getImageDetails(imgfile):
        im = Image.open(imgfile)
        size = im.size
        im.load() # closes the pointer after it loads the image
    
        return size[0], size[1], im
    
    widths, heights, images = zip(*(getImageDetails(i) for i in imgfiles))
    
    用上述代码替换这些行:

    images = map(Image.open, imgfiles)
    widths, heights = zip(*(i.size for i in images))
    

    要解决“打开文件过多”错误,可以使用以下功能:

    def getImageDetails(imgfile):
        im = Image.open(imgfile)
        size = im.size
        im.load() # closes the pointer after it loads the image
    
        return size[0], size[1], im
    
    widths, heights, images = zip(*(getImageDetails(i) for i in imgfiles))
    
    用上述代码替换这些行:

    images = map(Image.open, imgfiles)
    widths, heights = zip(*(i.size for i in images))
    

    我仍然不明白您希望生产什么,但这应该很接近,而且要快得多,容易得多:

    #!/usr/local/bin/python3
    from PIL import Image
    import numpy as np
    
    # Create array to hold output image
    result=np.zeros([1,13*13*13,3],dtype=np.uint8)
    
    j=0
    for r in range(65,130,5):
        for g in range(65,130,5):
            for b in range(65,130,5):
                result[0,j]= (r,g,b)
                j+=1
    
    # Convert output array to image and save
    im=Image.fromarray(result)
    im.save("result.jpg")
    

    请注意,上述脚本旨在一次性完成脚本的工作

    请注意,我使结果图像更高(更胖),因此您可以看到它,实际上它只有1像素高

    请注意,我添加了一个步骤5,以使输出图像更小,因为它超出了大小限制-至少对于JPEG而言


    请注意,我在(130-65)/5的基础上粗略地猜测了阵列宽度(13*13*13),因为我真的不理解您的要求。

    我仍然不理解您希望生成什么,但这应该很接近,而且更快、更容易:

    #!/usr/local/bin/python3
    from PIL import Image
    import numpy as np
    
    # Create array to hold output image
    result=np.zeros([1,13*13*13,3],dtype=np.uint8)
    
    j=0
    for r in range(65,130,5):
        for g in range(65,130,5):
            for b in range(65,130,5):
                result[0,j]= (r,g,b)
                j+=1
    
    # Convert output array to image and save
    im=Image.fromarray(result)
    im.save("result.jpg")
    

    请注意,上述脚本旨在一次性完成脚本的工作

    请注意,我使结果图像更高(更胖),因此您可以看到它,实际上它只有1像素高

    请注意,我添加了一个步骤5,以使输出图像更小,因为它超出了大小限制-至少对于JPEG而言


    请注意,我在(130-65)/5的基础上粗略地猜测了数组宽度(13*13*13),因为我并不真正理解您的要求。

    您实际上想做什么?这很难理解——你似乎在制作成千上万张出于某种原因不想要的图片,然后试图以某种未知的方式将它们重新缝合在一起。结果会是怎样的?请问“1像素尺寸”的图像是什么?我已经编辑了我的问题。如果你不明白,请告诉我你想要一个1像素高,65*65*65像素宽的图像?是的,没错。非常感谢你!你到底想做什么?这很难理解——你似乎在制作成千上万张出于某种原因不想要的图片,然后试图以某种未知的方式将它们重新缝合在一起。结果会是怎样的?请问“1像素尺寸”的图像是什么?我已经编辑了我的问题。如果你不明白,请告诉我你想要一个1像素高,65*65*65像素宽的图像?是的,没错。非常感谢你!非常感谢,但我又犯了一个错误
    TypeError:“tuple”对象不可调用
    我已修复该错误,抱歉。假设Im.size是一个函数,但它实际上是一个属性。非常感谢您,但我遇到了另一个错误
    TypeError:“tuple”对象不可调用
    我已修复该错误,抱歉。假设Im.size是一个函数,但它实际上是一个属性。我试图生成的图像是水平方式的“具有不同RGB值的像素”的组合,因此,例如,假设每个像素。是一个像素。我正在创建一个组合。喜欢一直到65^3,其中每个像素具有不同的RGB值。你现在明白了吗?我正在尝试生成的图像是“具有不同RGB值的像素”以水平方式的组合,例如,假设每一个像素。是一个像素。我正在创建一个组合。喜欢一直到65^3,其中每个像素具有不同的RGB值。你现在明白了吗?