2013-12-16 2 views
0

У меня есть прямоугольное изображение (т. Е. 1280 x 1024), которое мне нужно вращать вокруг его центральной точки, а затем переводить в заданную точку.Повернуть + перевод?

В методе виджет paintEvent, это то, что я делаю:

def paintEvent(self, event): 
    # self._center are the coordinates where I want to set the rotated image's center. 

    t = QtGui.QTransform() 
    s = self._pm.size() # self._pm is the image to rotate. 
    t.translate(s.width()/2, s.height()/2) 
    t.rotate(self._degrees) 
    t.translate(-s.width()/2, -s.height()/2) 

    # now my image is properly rotated. Now I need to translate it to the final 
    # coordinates. 

    t.translate (self._center.x, self._center.y) 

    p = QtGui.QPainter(self) 
    p.setTransform(t) 
    p.drawPixmap(0, 0, self._pm) 
    p.end() 

И это нормально с вращением. Проблема заключается в том, что я не могу найти способ, чтобы показать мое изображение с новым центром, он работает только тогда, когда self._degrees является 0.

Если я применить другой translate к объекту QTransform и self._degrees не 0, то изображение никогда в центре, где бы я ожидал.

Может ли кто-нибудь указать мне в правильном направлении, пожалуйста?

Редактировать
PS: Я забыл упомянуть, что новый центр координатных основаны на координатах исходного изображения, а не на том, повернутые изображениях.

+0

объяснить: «е применяю другой перевод к объекту QTransform и сам. _degrees не равно 0, изображение никогда не будет сосредоточено там, где я ожидаю, что это будет ». Я предполагаю, что вы примените это преобразование в ближайшее время. Показать код с проблемной трансформацией. –

+0

@MarekR спасибо, см. Мое последнее редактирование. – Simone

ответ

0

Если я вас правильно понимаю self._center содержит информацию, где должен располагаться центр поворота. В таком случае довольно просто сделать:

def paintEvent(self, event): 
    t = QtGui.QTransform() 
    s = self._pm.size() # self._pm is the image to rotate. 
    t.translate(-self._center.x, -self._center.y) 
    t.rotate(self._degrees) 
    t.translate(self._center.x, self._center.y) 

    p = QtGui.QPainter(self) 
    p.setTransform(t) 
    p.drawPixmap(0, 0, self._pm) 
    p.end() 

Помните, что setTransform набор преобразование художников системы координат.

+0

Не совсем: центр вращения - это центр оригинального изображения. Как только изображение повернуто, мне нужно перевести его в другой центр, координата которого - self._center. – Simone

1

Вы должны выполнить перевод перед вращением (a QTransform изменяет систему координат).

Например: Защиту paintEvent (я, событие): Прямоугольник = QRect (0, 0, 20, 10)

self._center = QPoint(50, 50) 

t = QTransform() 
#Do not forget to substract the rect size to center it on self._center 
t.translate (self._center.x() -rect.width()/2, self._center.y() -rect.height()/2) 

t.translate(rect.width()/2, rect.height()/2) 
t.rotate(45.0) 
t.translate(-rect.width()/2, -rect.height()/2) 

p = QPainter(self) 
p.save() 

#Paint original rect 
p.setBrush(QBrush(Qt.black)) 
p.drawRect(rect) 

# Paint rect with transformation 
p.setTransform(t) 
p.setBrush(QBrush(Qt.red)) 
p.drawRect(rect) 

# Paint self._center 
p.restore() 
p.setPen(QPen(Qt.black, 5)) 
p.drawPoint(self._center) 

p.end() 

 Смежные вопросы

  • Нет связанных вопросов^_^