我想将2张图像一起添加到一个新图像中,我可以分别打开每个图像,并且已经成功将它们添加到了数组中,当我尝试打印icon.width
或icon.height
时,我得到了我要迭代的图标的实际宽度/高度。我的问题是当我尝试粘贴图像时,出现此奇怪的错误
AttributeError: 'PngImageFile' object has no attribute 'load_seek'
到目前为止,我发现没有任何帮助,而且我不知道自己在做什么错。
from PIL import Image
icons = []
with Image.open('images/poison_copy.png') as copy:
icons.append(copy)
with Image.open('images/poison_2.jpg') as scopy:
icons.append(scopy)
# New sheet
first = icons[0]
sheet = Image.new(first.mode, (2*first.width, first.height))
x = 0
for icon in icons:
sheet.paste(icon, (x, 0))
x += icon.width
sheet.show()
答案 0 :(得分:1)
您的问题在这里:
with Image.open('images/poison_copy.png') as copy:
icons.append(copy)
with Image.open('images/poison_2.jpg') as scopy:
icons.append(scopy)
以这种方式使用with
时,您是在告诉Python将with
下的块保留在其中时关闭要打开的文件。但是您可以通过将它们推入icons
来节省文件句柄。这意味着icons
中的两个文件句柄已死……它们将被调用其close()
方法。 PIL文档介绍了close()
方法:
此操作将破坏图像核心并释放其内存。的 图片数据以后将无法使用。
paste()
方法失败,因为您为它提供了一个关闭的,因此无用的文件句柄之一。
您要做的是保持文件打开状态,直到您处理完这些图像为止。解决此问题的一种方法是用以下这些行替换with
块:
copy = Image.open('images/poison_copy.png')
icons.append(copy)
scopy = Image.open('images/poison_2.jpg')
icons.append(scopy)
然后,在粘贴后立即关闭文件:
for icon in icons:
sheet.paste(icon, (x, 0))
icon.close()
x += icon.width