我正在使用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)
。
由于文档明确列出了可选参数fill
和outline
,为什么Pillow抱怨它只需要1个参数?
pip freeze
说Pillows版本为3.3.1
。
答案 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,或者为我们提供一个可以为您创建此例外的工作代码段?