web-dev-qa-db-ja.com

PILで長方形の幅を指定する方法はありますか?

PIL /枕のImageDrawモジュールを使用して、画像に厚い長方形を描画しようとしています。

draw.rectangle([x1, y1, x2, y2], outline='yellow', width=3)を使用してみましたが、widthパラメータが好きではないようです。

自分のやりたいことをたくさんの線でエミュレートすることはできますが、適切な方法がないかと思っていました。

'''
coordinates = [(x1, y1), (x2, y2)]

    (x1, y1)
        *--------------
        |             |
        |             |
        |             |
        |             |
        |             |
        |             |
        --------------*
                      (x2, y2)

'''

def draw_rectangle(drawing, xy, outline='yellow', width=10):
    top_left = xy[0]
    bottom_right = xy[1]
    top_right = (xy[1][0], xy[0][1])
    bottom_left= (xy[0][0], xy[1][1])

    drawing.line([top_left, top_right], fill=outline, width=width)
    drawing.line([top_right, bottom_right], fill=outline, width=width)
    drawing.line([bottom_right, bottom_left], fill=outline, width=width)
    drawing.line([bottom_left, top_left], fill=outline, width=width)
17
waspinator

[〜#〜] update [〜#〜]-Pillow> = 5.3.0 rectanglewidth引数をサポートするようになりました:PIL.ImageDraw.ImageDraw.rectangle(xy, fill=None, outline=None, width=0)

前の回答:

これは、最初の最初の長方形を描画し、次に内側に向かってさらに長方形を描画するメソッドです-線の幅は境界線に沿って中央揃えnotであることに注意してください。

def draw_rectangle(draw, coordinates, color, width=1):
    for i in range(width):
        rect_start = (coordinates[0][0] - i, coordinates[0][1] - i)
        rect_end = (coordinates[1][0] + i, coordinates[1][1] + i)
        draw.rectangle((rect_start, rect_end), outline = color)

# example usage

im = Image.open(image_path)
drawing = ImageDraw.Draw(im)

top_left = (50, 50)
bottom_right = (100, 100)

outline_width = 10
outline_color = "black"

draw_rectangle(drawing, (top_left, bottom_right), color=outline_color, width=outline_width)
16
Tim K

4つの線の代わりに、4つの点を持つ1つの線を描画して、長方形を作成することもできます。

def drawrect(drawcontext, xy, outline=None, width=0):
    (x1, y1), (x2, y2) = xy
    points = (x1, y1), (x2, y1), (x2, y2), (x1, y2), (x1, y1)
    drawcontext.line(points, fill=outline, width=width)

# example
from PIL import Image, ImageDraw
im = Image.new("RGB", (150, 150), color="white")
draw = ImageDraw.Draw(im)

drawrect(draw, [(50, 50), (100, 100)], outline="red", width=5)

im.show()
5
gdwarf

この方法は、Ubuntu 18.04のPIL v1.1.7およびpillow v 5.3.0で機能します。角は正方形ではありませんが、幅パラメータを使用して4本の線を描画して長方形を作成するアプローチとは対照的に、角は少なくとも1/2ピクセルだけずれています。 pillow/pilの線描画アルゴリズムにはまだバグがあると思います。

def drawrect(drawcontext, xy, color=None, width=1):
    (x1, y1), (x2, y2) = xy
    offset = 1
    for i in range(0, width):
        drawcontext.rectangle(((x1, y1), (x2, y2)), outline=color)
        x1 = x1 - offset
        y1 = y1 + offset
        x2 = x2 + offset
        y2 = y2 - offset

そしてあなたのコードでは次のようになります:

# example
from PIL import Image, ImageDraw
im = Image.new("RGB", (150, 150), color="white")
draw = ImageDraw.Draw(im)

drawrect(draw, [(50, 50), (100, 100)], outline="red", width=5)
del draw
im.show()

Gdwarfが解決策を提供してくれたことに感謝します。

2
user1045680

PILの四角形がwidthパラメータをサポートするようになりました。

from PIL import Image, ImageDraw

height = width = 800
img = Image.new('RGB', (height, width), (255, 255, 255))
draw = ImageDraw.Draw(img)
draw.rectangle([100,100,500,400], width = 10, outline="#0000ff")
img.show()
2
Al Mamun

あなたは、例えば、ビューの長方形を描くことができます:

draw.rectangle([(x, y),(x+w,y+h) ], outline=(0,0,255,255))
draw.rectangle([(x+1, y+1),(x+w-1,y+h-1) ], outline=(0,0,255,255))
draw.rectangle([(x+2, y+2),(x+w-2,y+h-2) ], outline=(0,0,255,255))
...

ループの原因と関数。

0