2016-08-22 164 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