Как нарисовать наклонный эллипс в ImageDraw?

Я пытаюсь нарисовать наклонный эллипс при рисовании изображения. Однако я не уверен, как это определить, поскольку, хотя приведенная ниже схема будет перемещать точки, я думаю, что это просто сдавит эллипс, а не повернет его (также я думаю, что в любом случае с преобразованием что-то не так). Я загружаю результат этой функции в команду ellipse и добавляю его к существующему изображению, поэтому любые методы, которые поворачивают все изображение, бесполезны. OD - это просто квадратное смещение относительно центра координат, который я использую.

def ellipsebound(major, minor, tilt=0, offset=0,  angle=0):
    #creates a bound for an ellispe, defined with tilt meaning to rotate the orthogonal axis and angle corresponds to rotating the ellipse position
    angle = radians(angle)
    tilt = radians(tilt)
    box=(
    1 + int(ceil((OD+offset*cos(angle)+(major*cos(tilt)+minor*sin(tilt)))/conv)), 
    1 + int(ceil((OD+offset*sin(angle)+(major*sin(tilt)-minor*cos(tilt)))/conv)),
 int(ceil((2*OD-(OD-offset*cos(angle)-(major*cos(tilt)+minor*sin(tilt)))/conv))),
 int(ceil((2*OD-(OD-offset*sin(angle)-(major*sin(tilt)-minor*cos(tilt)))/conv)))
 ) #create bounding box
    return box

Кто-нибудь знает, как это сделать?


person Elliot    schedule 24.08.2011    source источник
comment
Для полного описания эллипса вам потребуются только большая и малая половина, центральная точка и один угол. Не уверен, почему у вас есть дополнительный угол (и angle, и tilt), если только вы не рисуете сплющенный эллипс, который на самом деле не является эллипсом как таковым.   -  person John    schedule 24.08.2011
comment
Вот и проверьте этот вопрос. stackoverflow.com/questions/87734/   -  person John    schedule 24.08.2011
comment
Система координат, в которой размещается эллипс, полярная. Смещение и угол перемещают центральную точку эллипса (относительно смещения = 0, являющегося (OD, OD) в координатах PIL), в то время как большие, второстепенные и наклон управляют его формой.   -  person Elliot    schedule 24.08.2011
comment
Как это решает проблему ротации? Когда я перечитываю спецификацию, ограничивающая рамка всегда будет прямым прямоугольником (вы указываете только 2 угла, поэтому угловой информации нет), а эллипс будет тем, который занимает максимальную площадь (например, без наклона эллипс). Здесь что-то происходит, чего я не понимаю.   -  person Elliot    schedule 24.08.2011
comment
Это то, что вы используете? pythonware.com/library/pil/handbook/imagedraw.htm Если так что не похоже, что вы можете что-то с этим поделать.   -  person John    schedule 24.08.2011
comment
Да, это то, что я использую.   -  person Elliot    schedule 24.08.2011


Ответы (1)


Похоже, что «прямоугольник», который используется для рисования эллипса, не имеет связанного с ним вращения. Он просто определяется экстентами (левый, верхний, правый, нижний).

Один из возможных обходных путей (в зависимости от того, что вам нужно сделать) - нарисовать эллипс (правильного размера, но без поворота) на промежуточном изображении, использовать метод image.rotate(), а затем вставить его в целевое изображение.

Надеюсь, это поможет.

person tugs    schedule 24.08.2011
comment
Хороший общий подход, но как насчет использования Image.rotate вместо прокрутки. - person tom10; 10.09.2011