首页 > 解决方案 > Python PIL:旋转和缩放图像,使两个点匹配另外两个点

问题描述

假设我有一个包含两个点的图像。

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

我想旋转和缩放图像,使两个点现在都在不同的位置。

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

在伪代码中,我正在寻找这样的东西

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

换句话说,如果 pointA 和 pointB 是触摸时的手指,而 newPointA 和 newPointB 是抬起时的手指,那么缩放和旋转将如何在触摸屏设备上工作。

创建黑色边框不是问题。

我知道这可能是一个简单的操作,因为它是如何在触摸屏设备上用两根手指进行缩放和旋转,但不幸的是,我对几何的理解太有限,无法弄清楚。

标签: pythongeometrypython-imaging-library

解决方案


绕原点的角度为A的旋转可以表示为

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

用因子F缩放,再次从原点是

xScaled = xBase · F
yScaled = yBase · F

你可能会说有两个 (x,y) 点和它们的最终转换点,通过将它们插入方程并求解系统来解决问题。但问题是系统不容易解决;你需要一些数字近似。

但并非一切都丢失了:)

两点之间的角度Bdx=x2-x1很容易计算:取增量并dy=y2-y1使用B= atan2(dx,dy)(防止自己从atan(dx,dy))。使用前/后移动触摸你会得到两个角度。旋转角度为A= B2-B1

比例因子F也很简单:计算手指在触摸时和手指移动后的距离。因子是它们之间的商。

注意:
我认为您还需要翻译,否则您的最终图像可能不是您所期望的。

我要做的是:

  1. (mx,my)首先计算触摸动作中手指之间的中点。还使用触摸和提升动作计算旋转角度A和比例因子 F。
  2. 然后平移整个图像,使其原点成为中间点。只需减去那些中间坐标(mx,my)
  3. 然后旋转和缩放。
  4. 然后通过添加之前使用的存储中间坐标来撤消平移。

在步骤“1”中。我假设旋转发生在中点附近。你可以考虑其他点。例如,如果手指“一”不移动很多,但手指“二”移动很多,则可能是旋转/缩放围绕手指“一”的坐标进行。如果是这样,请使用这些坐标。

获得该“中间”点的一般情况可能是计算触摸和抬起动作时手指一指二指的交点。


推荐阅读