升级 Pillow 从 2.8.1 到 4.1.0 时遇到同样的问题。
下面是一段运行Pillow==4.1.0时会产生异常的示例代码:
from PIL import Image
img = Image.new('RGBA', [100,100])
# An empty mask is created to later overlay the original image (img)
mask = Image.new('L', img.size, 255)
# Get transparency (mask) layer pixels, they will be changed!
data = mask.load()
# The function used later
def foo(x,y): return round(1.0*x/(y+1))
# Update all pixels in the mask according to some function (foo)
for x in range(img.size[0]):
for y in range(img.size[1]):
data[x,y] = foo(x,y)
输出:
Traceback (most recent call last):
File "x.py", line 12, in <module>
data[x,y] = foo(x,y)
SystemError: new style getargs format but argument is not a tuple
此处的实际错误与异常中所述的内容无关。实际上,分配给数据的数据类型是错误的。在2.8.1 中int 和float 都是有效的,所以像data[x,y]=1.0 这样的东西是有效的,而在4.1.0 你需要使用这样的整数:
data[x,y]=1
data[x,y]=int(1.0)
因此,在上面的示例中,foo 可以重新定义为以下内容,以便在 2.8.1 和 4.1.0 中都可以使用。:
def foo(x,y): return int(round(1.0*x/(y+1)))