Python在PIL图像对象上复制

36 投票
1 回答
44436 浏览
提问于 2025-04-16 21:59

我正在尝试创建一组缩略图,每个缩略图都是从原始图片单独缩小的。

image = Image.open(path)
image = image.crop((left, upper, right, lower))
for size in sizes:
  temp = copy.copy(image)
  temp.thumbnail((size, height), Image.ANTIALIAS)
  temp.save('%s%s%s.%s' % (path, name, size, format), quality=95)

上面的代码看起来运行得不错,但在测试时我发现有些图片(我也不知道它们有什么特别之处,可能只是PNG格式的)会出现这个错误:

/usr/local/lib/python2.6/site-packages/PIL/PngImagePlugin.py in read(self=<PIL.PngImagePlugin.PngStream instance>)
line: s = self.fp.read(8)
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'read' 

如果不使用 copy(),这些图片就能正常工作。

我可以为每个缩略图重新打开并裁剪图片,但我更希望能找到一个更好的解决办法。

1 个回答

69

我想说,copy.copy() 这个方法对 PIL 的 Image 类可能不太管用。你可以试试用 Image.copy(),因为这个方法是专门为这个目的设计的:

image = Image.open(path)
image = image.crop((left, upper, right, lower))
for size in sizes:
  temp = image.copy()  # <-- Instead of copy.copy(image)
  temp.thumbnail((size, height), Image.ANTIALIAS)
  temp.save('%s%s%s.%s' % (path, name, size, format), quality=95)

撰写回答