Python PIL : 두 점이 다른 두 점과 일치하도록 이미지 회전 및 크기 조정

Nov 16 2020

두 점이있는 이미지가 있다고 가정 해 보겠습니다.

pointA = (100,100)
pointB = (200,200)

이제 두 지점이 서로 다른 위치에 있도록 이미지 를 회전하고 크기를 조정 하고 싶습니다 .

newPointA = (250,320)
newPointB = (540, 330)

의사 코드에서 나는 이와 같은 것을 찾고 있습니다.

adjusted = im.transformToPoint(originalA, originalB, newA, newB)

즉, pointA와 pointB가 터치 할 때 손가락이고 newPointA와 newPointB가 손가락을 들어 올릴 때 터치 스크린 장치에서 스케일링 및 회전이 작동하는 방식입니다.

생성되는 검은 색 테두리는 문제가되지 않습니다.

터치 스크린 장치에서 두 손가락으로 크기 조정 및 회전이 작동하는 방식이므로 간단한 작업 일 가능성이 있지만 불행히도 기하학에 대한 이해가 너무 제한적입니다.

답변

2 Ripi2 Nov 16 2020 at 03:09

원점을 중심으로 한 각도 A 의 회전 은 다음과 같이 표현할 수 있습니다.

xNew = xOld·cos(A) - yOld·sin(A)
yNew = xOld·sin(A) + yOld·cos(A)

요인 F로 스케일링 하면 다시 원점에서

xScaled = xBase · F
yScaled = yBase · F

두 개의 (x, y) 점과 최종 변환 된 점이 있으면이를 방정식에 대입하고 시스템을 풀면 문제가 해결된다고 말할 수 있습니다. 그러나 문제는 시스템이 해결하기 쉽지 않다는 것입니다. 숫자 근사화가 필요합니다.

그러나 모든 것이 손실되는 것은 아닙니다. :)

각도 B 두 점 사이를 쉽게 계산된다 증분 가져 dx=x2-x1dy=y2-y1사용을 B= atan2(dx,dy)(에서 자신을 방지 atan(dx,dy)). 전후 이동 터치를 사용하면 두 가지 각도를 얻을 수 있습니다. 회전 각도는입니다 A= B2-B1.

배율 계수 F 도 쉽습니다. 터치시 손가락 사이의 거리와 손가락 이동 후의 거리를 계산합니다. 요인은 그들 사이의 몫입니다.

참고 : 번역
도 필요하다고 생각합니다 . 그렇지 않으면 최종 이미지가 예상과 다를 수 있습니다.

내가 할 일은 :

  1. 먼저 (mx,my)터치 동작에서 손가락 사이의 중간 지점을 계산합니다 . 또한 두 가지 터치 리프트 동작을 사용하여 회전 각도 A 와 축척 계수 F 를 계산합니다 .
  2. 그런 다음 원점이 중간 지점이되도록 전체 이미지를 변환합니다. 중간 좌표를 빼면 (mx,my)됩니다.
  3. 그런 다음 회전하고 크기를 조정합니다.
  4. 그런 다음 이전에 사용 된 저장된 중간 좌표를 추가하여 변환을 취소합니다.

'1'단계에서. 회전이 중간 지점에서 발생한다고 가정합니다. 다른 점을 고려할 수 있습니다. 예를 들어 손가락 "one"은 많이 움직이지 않지만 "two"손가락은 움직이면 회전 / 크기 조정이 손가락 "one"의 좌표를 기준으로 할 수 있습니다. 그렇다면 이러한 좌표를 사용하십시오.

아마도 "중간"지점을 얻는 일반적인 경우는 터치 및 리프트 동작에서 손가락 1 대 손가락 2의 교차점을 계산하는 것입니다.