2015-12-13 40 views
8

Próbuję narysować grube prostokąty na obrazie przy użyciu modułu ImageDraw z PIL/poduszki.Czy istnieje sposób określenia szerokości prostokąta w pliku PIL?

Próbowałem używać draw.rectangle([x1, y1, x2, y2], outline='yellow', width=3), ale wydaje się nie podoba mi się parametr width.

Mogę naśladować to, co chcę zrobić z kilkoma liniami, ale zastanawiałem się, czy istnieje odpowiedni sposób robienia tego.

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

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

''' 
def draw_rectangle(drawing, coordinates, color='yellow', width=3): 
    #top 
    line_coordinates = [coordinates[0], coordinates[1], coordinates[2], coordinates[1]] 
    drawing.line(line_coordinates, fill=color, width=width) 

    #left 
    line_coordinates = [coordinates[0], coordinates[1], coordinates[0], coordinates[3]] 
    drawing.line(line_coordinates, fill=color, width=width) 

    #right 
    line_coordinates = [coordinates[2], coordinates[1], coordinates[2], coordinates[3]] 
    drawing.line(line_coordinates, fill=color, width=width) 

    #bottom 
    line_coordinates = [coordinates[0], coordinates[3], coordinates[2], coordinates[3]] 
    drawing.line(line_coordinates, fill=color, width=width) 

Odpowiedz

5

PIL na rectangle nie obsługuje width argument.

Napisałem metodę nieefektywną, dobrze do zabawy - ale uwaga: szerokość linii to , a nie wyśrodkowane wzdłuż granicy.

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

można narysować widok rects np:

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

przyczyny w pętli i funkcji.