2016-08-22 161 views
3

我在使用Pillow的for-loop中绘制矩形。这在我的台式电脑上工作,但在我的笔记本电脑上抛出一个奇怪的例外。枕头:使用Draw.rectangle的奇怪行为

这是代码(缩短):

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) 

我不明白,为什么这个代码失败:在枕头的自己documentationPIL.ImageDraw.Draw.rectangle定义这些参数:rectangle(xy, fill=None, outline=None)

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

pip freeze说枕头版本是3.3.1

回答

3

如果你读了灰度图像并尝试绘制颜色矩形就可以了,你会得到错误信息:TypeError: function takes exactly 1 argument (3 given)

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

(我发现这个页面出现错误后,@ ascenator的测试用例帮助我弄清楚发生了什么。因为我的代码可以处理一些图像,而不是其他的)

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,还是向我们提供可为您创建此例外的工作代码片段?

+0

不,我在两者上都使用Python 2.7,包括3.3.1虚拟环境中的Python。即使是操作系统也是如此(Manjaro,Arch-Fork)。然而,我能够“修复”这个异常:我刚刚完全删除了Pillow +依赖关系并重新安装了它......这很奇怪,因为Python异常表明实际上某些方法的用法是错误的。 .. – daniel451