2014-03-12 3 views
-1

임의의 점 (일반적으로 이미지 자체의 경계 내)에서 이미지를 회전시키는 것을 시도하지만, 변환되지 않은 이미지의 점을 유지하려고합니다. 유래.임의의 점을 중심으로 QPixmap을 회전하십시오.

지금까지, 나는 이미지 회전 할 QTransform 접근 방식을 사용하고 있습니다 :

Qt는 코드 :이 점을 중심으로 "회전"하는 이미지를 돌려줍니다

image.transformed(QTransform() 
          .translate(-point.x(), -point.y()) 
          .rotateRadians(rot) 
          .translate(point.x(), point.y())); 

하지만이 그려집니다 원점이 원본이 아닌 변형 된 이미지에 해당하는 새 이미지 객체로 변환되므로 이미지를 페인팅하면 올바른 각도를 갖지만 위치가 어긋나게 변환됩니다. A] 변환 된 이미지에서 원래의 원점의 위치를 ​​계산하거나, B] 원점을 변경하지 않고 이미지를 회전하는 방법이 있습니까? 어떤 회전없이

: 여기

는 실제로 프로그램의

회전

Without Rotation

(이미지가보다는 원점되는 새로운 상자의 왼쪽 상단 모서리에 그려진 화상의 사전 변형의 기원)

With Rotation

답변

-1

좋아 상기 SOLU 원래 이미지와 회전 된 이미지에서 오프셋을 찾으려면 두 이미지의 중심점을 찾아 오프셋을 계산 한 다음 회전 된 점을 위치로 사용하여 내 이미지를 그립니다. 페인팅 할 때 이미지.

QPixmap ImageBone::getTransformedImage(QPointF point, qreal rot, QPointF &origin, QPointF anchor = QPointF(0, 0)) 
{ 
    QPointF center = QPointF(image.width()/2, image.height()/2); 
    qreal dist = QLineF(anchor, center).length(); 
    qreal a = qAtan2(anchor.y() - center.y(), anchor.x() - center.x()); 
    QPointF rotAnchor(qCos(rot + a) * dist, qSin(rot + a) * dist); 
    rotAnchor += center; 

    QPixmap rotImage = image.transformed(QTransform() 
            .translate(-point.x(), -point.y()) 
            .rotateRadians(rot) 
            .translate(point.x(), point.y()) 
           ); 

    QPointF rotCenter = QPointF(rotImage.width()/2, rotImage.height()/2); 
    QPointF offset = rotCenter - center; 

    origin = point - (rotAnchor + offset); 

    return rotImage; 
} 
관련 문제