Python PIL:旋转和缩放图像,使两个点与其他两个点匹配

2024-09-27 22:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个有两点的图像

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

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

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

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

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

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

正在创建的黑色边框不是问题

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


Tags: 代码图像手指imadjustedpointapointbnewb
1条回答
网友
1楼 · 发布于 2024-09-27 22:46:06

围绕原点的角度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”中,我假设旋转发生在中点附近。你可以考虑其他问题。例如,如果手指“一”没有移动很多,但手指“二”移动了很多,那么旋转/缩放可能是围绕手指“一”的坐标进行的。如果是这样,使用这些坐标

也许获得“中间”点的一般情况是计算接触和提升动作时手指1到手指2的线的交点

相关问题 更多 >

    热门问题