枕头:使用 Draw.rectangle 的奇怪行为

Pillow: strange behavior using Draw.rectangle

我正在使用 Pillow 在 for 循环中绘制矩形。这在我的台式电脑上有效,但在我的笔记本电脑上抛出一个奇怪的异常。

这是代码(缩写):

from PIL import Image, ImageDraw
(...)
img = Image.open(sys.argv[1])
rimg = img.copy()
rimg_draw = ImageDraw.Draw(rimg)
(...)
(for-loop)
    rimg_draw.rectangle((x1, y1, x2, y2), fill=None, outline=(255, 0, 0))

这将引发以下异常:

rimg_draw.rectangle((x1, y1, x2, y2), fill=None, outline=(255, 0, 0))
  File "/home/daniel/tensorflow2.7/lib/python2.7/site-packages/PIL/ImageDraw.py", line 203, in rectangle
    ink, fill = self._getink(outline, fill)
  File "/home/daniel/tensorflow2.7/lib/python2.7/site-packages/PIL/ImageDraw.py", line 124, in _getink
    ink = self.draw.draw_ink(ink, self.mode)
TypeError: function takes exactly 1 argument (3 given)

我不明白,为什么这段代码会失败:在 Pillow 自己的 documentation PIL.ImageDraw.Draw.rectangle 中定义了 with 这些参数:rectangle(xy, fill=None, outline=None) .

既然文档明确列出了可选参数 filloutline,为什么 Pillow 抱怨它只需要 1 个参数?

pip freeze 说 Pillows 版本是 3.3.1.

在对您的代码进行轻微调整后 运行,我无法重现异常。

from PIL import Image, ImageDraw

img = Image.open('testfig.png')
rimg = img.copy()
rimg_draw = ImageDraw.Draw(rimg)
rimg_draw.rectangle((10, 10, 30, 30), fill=None, outline=(255, 0, 0))
rimg.show()

但是,我的系统上 运行ning Python 3.4.4 和 Pillow 3.2.0。与台式机相比,笔记本电脑上的版本有明显差异吗?

您能否分别更深入地查看您的代码行 124 和 203,或者向我们提供为您创建此异常的有效代码片段?

如果您读取 灰度 图像并尝试在其上绘制 颜色 矩形,您将收到错误消息:TypeError: function takes exactly 1 argument (3 given)

您需要提供像 outline=(255) 这样的颜色,而不是像 outline=(255, 0, 0) 这样的 RGB 颜色。否则你会得到错误,因为你给出了 3 个颜色参数,而不是一个。如果确实要在灰度图像上绘制颜色,可以先将图像转换为 RGB:img = img.convert('RGB')

编辑:由于许多其他人也遇到了这个问题,我向 Pillow 提交了一个错误,他们迅速 made a fix。所以这个问题和答案有望很快过时。