2016-08-22 21 views
3

私は枕を使って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つのカラー引数を与えているので、エラーは1つではありません。グレースケールイメージにカラーを描画する場合は、最初にイメージを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

いいえ私は、仮想環境でピロー3.3.1を含め、両方でPython 2.7を使用しています。 OSも同じです(Manjaro、Arch-Fork)。しかし、私は例外を "修正"することができました:私はちょうど枕+ depedenciesを完全に削除し、それを再インストールしました...これは非常に奇妙です、Pythonの例外は、 .. – daniel451