枕头:使用 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)
.
既然文档明确列出了可选参数 fill
和 outline
,为什么 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。所以这个问题和答案有望很快过时。
我正在使用 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)
.
既然文档明确列出了可选参数 fill
和 outline
,为什么 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。所以这个问题和答案有望很快过时。