代码之家  ›  专栏  ›  技术社区  ›  0x90

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

  •  1
  • 0x90  · 技术社区  · 4 年前

    假设我有一张有两点的图片。

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

    我想 旋转和缩放 这样,两个点现在都位于不同的位置。

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

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

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

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

    创建黑色边界不是问题。

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

    0 回复  |  直到 4 年前
        1
  •  2
  •   Ripi2 user10587824    4 年前

    有角度的旋转 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-x1 dy=y2-y1 使用 B= atan2(dx,dy) (避免 atan(dx,dy) ).使用“运动前/运动后”触摸屏可以获得两个角度。旋转角度是 A= B2-B1 .

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

    注:
    我想你也需要一个 翻译 ,否则你的最终形象可能不是你所期望的。

    我要做的是:

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

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

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