2011-01-25 20 views
10

私はこのコードが動作するようになっていくつかの問題を抱えているように見える:Python PIL:イメージの途中で楕円を描く方法は?

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() 

これは40個のピクセル40である(60,60)で楕円を描く必要があります。イメージは何も返しません。

このコードは、しかし、正常に動作します:

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

ちょうど私が(楕円を配置する場所のための)最初の2コordsを変更したとき、彼らはよりも大きい場合、それは動作しませんようです描画される楕円のサイズ。たとえば、次のように

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

作品が、唯一のRECTの一部を示しています。一方、

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

は全く何も示していない。

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

答えて

15

境界ボックスは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.jpgoutput.png

+0

ありがとうございます - バウンディングボックスのアイデアは私には新しく、ここで少し混乱していました。素晴らしい説明と例をありがとう:) – Tommo

+0

喜んで:) :) – sahhhm

3

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

関連する問題