Несмотря на то, что более кривые пути кривой не работают с Aggdraw, как упоминалось @ ToniRuža, в Aggdraw есть еще один способ сделать это. Преимущество использования Aggdraw вместо PIL или ваших собственных функций Безье заключается в том, что Aggdraw сглаживает изображение, делая его более гладким (см. Рис. Внизу).
Символы Aggdraw
Вместо того чтобы использовать класс aggdraw.Path () для рисования, вы можете использовать класс aggdraw.Symbol(pathstring)
, который в основном такой же, за исключением того, что вы пишете путь в виде строки. В соответствии с документацией Aggdraw способ записи вашего пути в виде строки заключается в использовании синтаксиса пути SVG (см .: http://www.w3.org/TR/SVG/paths.html).. Обычно каждое добавление (узел) к пути начинается с
- буква, обозначающая действие рисования (верхний регистр для абсолютного пути, нижний регистр для относительного пути), за которым следует (без пробелов между ними)
- координата x (предшествует знак минус, если это отрицательное число или направление)
- запятая
- координата y (предшествует знак минус, если это отрицательное число или направление)
В вашей путевой строке просто разделите несколько узлов пробелом. Как только вы создали свой символ, просто не забудьте нарисовать его, передав его в качестве одного из аргументов draw.symbol(args)
.
Кривые Безье в символах Aggdraw
Специально для кубических кривых Безье вы пишете букву «C» или «c», за которой следуют 6 цифр (3 набора координат xy x1, y1, x2, y2, x3, y3 с запятыми между числами, но не между первый номер и буква). Согласно документам, существуют и другие версии Безье с использованием буквы «S (гладкий кубический Безье), Q (квадратичный Безье), T (гладкий квадратичный Безье)». Вот полный пример кода (требуется PIL и aggdraw):
print "initializing script"
# imports
from PIL import Image
import aggdraw
# setup
img = Image.new("RGBA", (1000,1000)) # last part is image dimensions
draw = aggdraw.Draw(img)
outline = aggdraw.Pen("black", 5) # 5 is the outlinewidth in pixels
fill = aggdraw.Brush("yellow")
# the pathstring:
#m for starting point
#c for bezier curves
#z for closing up the path, optional
#(all lowercase letters for relative path)
pathstring = " m0,0 c300,300,700,600,300,900 z"
# create symbol
symbol = aggdraw.Symbol(pathstring)
# draw and save it
xy = (20,20) # xy position to place symbol
draw.symbol(xy, symbol, outline, fill)
draw.flush()
img.save("testbeziercurves.png") # this image gets saved to same folder as the script
print "finished drawing and saved!"
И на выходе получается гладкая кривая Безье: