在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
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值。你现在明白了吗?