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

时间:2016-08-22 12:51:55

标签: python python-2.7 python-imaging-library pillow

我正在使用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被定义为 这些参数:rectangle(xy, fill=None, outline=None)

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

pip freeze说Pillows版本为3.3.1

2 个答案:

答案 0 :(得分:13)

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

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

(我在点击错误后找到了这个页面,@ ascenator的测试用例帮助我弄清楚发生了什么。由于我的代码使用了一些图像而不是其他图像,因此非常令人困惑。)

答案 1 :(得分:3)

稍微调整一下代码以使其运行后,我无法重现异常。

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()

但是,我在我的系统上运行Python 3.4.4和Pillow 3.2.0。与桌面相比,笔记本电脑上的版本是否存在明显差异?

您是否可以分别深入了解代码行124和203,或者为我们提供一个可以为您创建此例外的工作代码段?