12

このコードを機能させるのに問題があるようです。

import Image, ImageDraw

im = Image.open("1.jpg")

draw = ImageDraw.Draw(im)
draw.ellipse((60, 60, 40, 40), fill=128)
del draw 

im.save('output.png')
im.show()

これにより、(60,60)に40x40ピクセルの楕円が描画されます。画像は何も返しません。

ただし、このコードは正常に機能します。

draw.ellipse ((0,0,40,40), fill=128)

最初の2つの座標(楕円を配置する場所)を変更すると、描画する楕円のサイズよりも大きい場合は機能しないようです。例えば:

draw.ellipse ((5,5,15,15), fill=128)

動作しますが、rectの一部のみが表示されます。一方

draw.ellipse ((5,5,3,3), fill=128)

何も表示されません。

これは、長方形を描画するときにも発生します。

4

2 に答える 2

20

バウンディングボックスは4タプル(x0, y0, x1, y1)で、(x0, y0)はボックスの左上の境界であり、はボックス(x1, y1)の右下の境界です。

画像の中央に楕円を描画するには、楕円の境界ボックスの大きさを定義する必要があります(変数eXeY以下のコードスニペット)。

そうは言っても、以下は画像の中央に楕円を描くコードスニペットです。

from PIL import Image, ImageDraw

im = Image.open("1.jpg")

x, y =  im.size
eX, eY = 30, 60 #Size of Bounding Box for ellipse

bbox =  (x/2 - eX/2, y/2 - eY/2, x/2 + eX/2, y/2 + eY/2)
draw = ImageDraw.Draw(im)
draw.ellipse(bbox, fill=128)
del draw

im.save("output.png")
im.show()

これにより、次の結果が得られます(1.jpg左側、output.png右側)。

1.jpg output.png

于 2011-01-25T07:28:48.097 に答える
3

ellipse関数は、バウンディングボックス内に楕円を描画します。draw.ellipse((40,40,60,60))したがって、左上が右下よりも小さいその他の座標を使用する必要があります。

于 2011-01-25T04:19:11.827 に答える