2012-05-27 2 views
3

을 사용하여 두 이미지를 결합하지만 바로 그것을 얻을하지 않습니다 내가 두 QImages이어야 고정 된 크기의 배경 이미지 imgBg, 및 제 QImage imgFg이 아핀 변환을 사용하여 변환 된 다음 배경 이미지에 페인트 (및 클리핑)됩니다. 원점 주위Qt는 내가 해결하기 위해 아마 쉬운 문제에 직면하고있다 QTransform

  • 스케일 이미지 (균일 스케일링) 원점 주위
  • 회전 이미지
  • 배경 이미지의 소정의 기준 위치에 전경 화상 번역 다음과 같이

    아핀 변환은 전경의 이미지 센터가 기준 위치에 있도록

    // Setup transform 
    QTransform trans; 
    trans.translate(-imgFg.width()/2, -imgFg.height()/2); // move center of image to origin 
    trans.scale(scaleFac, scaleFac); 
    trans.rotate(angleDegrees); 
    trans.translate(imgFg.width()/2, imgFg.height()/2); 
    
    // Transform foreground image 
    imgFg = imgFg.transformed(trans); 
    
    // Paint on background image 
    QPointF referencePos(imgBg.width()/3, imgBg.height()/2); // some reference position 
    QPainter painter(&imgBg); 
    painter.drawImage(referencePos - QPointF(imgFg.width()/2, imgFg.height()/2), imgFg); 
    

    을만큼 난 단지 모든 것이 잘 작동 기준 위치 변경과 같이 여기

내가 지금까지 한 일이다. 배율 및/또는 회전을 사용할 때 이미지의 배율이 조정되고 회전되지만 정확한 위치에 배치되지 않습니다 (전경의 이미지 중심이 참조 점과 일치하지 않음). 변환 파이프 라인에 문제가 있습니까? 내가 실수를 했니?

+1

나는 두 번째 번역이 스케일링 계수를 고려해야한다고 생각합니다. – Mat

답변

3

QTransform에서 수행하는 명령문의 순서를 뒤 바꿔야합니다. 순서는 의 직관적 인 생각의 반대가되어야합니다. 이것은 선형 대수학에서 변환 행렬의 행렬 곱셈과 관련이 있습니다. (Change of basis 변환 행렬 ...) 문제는 변환이 소스 좌표계에 적용된다는 것입니다. 이는 소스 코드 시스템이 직관적이지 못하다는 것입니다. 당신이 여러 변환을 적용 할 때마다, 그들에게 당신이 이미지과 함께 할 것 일의 위해 수행

그래서 기억한다. 다음, (50, 50)를 원점 이동을 45도만큼 시계 방향으로 회전 반값 폭

스케일 텍스트 : 예를 들어

the documentation of QTransform 예 코드 표시

enter image description here

QTransform transform; 
transform.translate(50, 50); 
transform.rotate(45); 
transform.scale(0.5, 1.0); 

또 다른 문제는 스케일링 FAC를 취함으로써 다시 원점 이미지를 변환해야한다는 것입니다 토르를 고려해야합니다 (질문 주석에서 이것을 지적 해준 매트에게 감사드립니다). 당신의 코드에 적용

(작업 직관적 위해 위해 아래에서 위로 읽기) :

// Setup transform 
QTransform trans; 
trans.translate(imgFg.width()*scaleFac/2, imgFg.height()*scaleFac/2); 
trans.rotate(angleDegrees); 
trans.scale(scaleFac, scaleFac); 
trans.translate(-imgFg.width()/2, -imgFg.height()/2); 

마지막으로, 당신은 새와 같은 이미지의 센터을 갖고 싶어 원점 (원점)이므로 다시 번역하면 안됩니다 (코드에서 마지막 작업). 그런 다음 다른 크기/2를 추가하는 대신 참조 점에 이미지를 칠하십시오.또한 이미지에 변형을 적용한 다음이 이미지를 페인트해서는 안됩니다. 적어도 그것은 좋은 스타일이 아닙니다. 화가에게 변형을 적용하고 나중에 적용을 취소하십시오.

QTransform trans; 
trans.scale(scaleFac, scaleFac); 
trans.rotate(angleDegrees); 
trans.translate(imgFg.width()/2,imgFg.height()/2); 

// Save old transform (only needed if you use other transformations) 
const QTransform &oldTrans = painter.transform(); 
// Apply new transform 
painter.setTransform(trans); 
// Paint image at reference point 
painter.drawImage(referencePoint, imgFg); 
// Restore transform 
painter.setTransform(oldTrans); 
+0

광범위한 설명에 감사드립니다. 스케일링 요인에 의한 최종 번역의 확장은 문제를 해결했습니다. – Hyndrix

관련 문제