python - 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 是抬起时的手指,那么缩放和旋转将如何在触摸屏设备上工作。
创建黑色边框不是问题。
我知道这可能是一个简单的操作,因为它是如何在触摸屏设备上用两根手指进行缩放和旋转,但不幸的是,我对几何的理解太有限,无法弄清楚。
解决方案
绕原点的角度为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也很简单:计算手指在触摸时和手指移动后的距离。因子是它们之间的商。
注意:
我认为您还需要翻译,否则您的最终图像可能不是您所期望的。
我要做的是:
(mx,my)
首先计算触摸动作中手指之间的中点。还使用触摸和提升动作计算旋转角度A和比例因子 F。- 然后平移整个图像,使其原点成为中间点。只需减去那些中间坐标
(mx,my)
。 - 然后旋转和缩放。
- 然后通过添加之前使用的存储中间坐标来撤消平移。
在步骤“1”中。我假设旋转发生在中点附近。你可以考虑其他点。例如,如果手指“一”不移动很多,但手指“二”移动很多,则可能是旋转/缩放围绕手指“一”的坐标进行。如果是这样,请使用这些坐标。
获得该“中间”点的一般情况可能是计算触摸和抬起动作时手指一指二指的交点。
推荐阅读
- python-3.x - 如何为 AWS Athena 服务编写 Pytest
- tsql - SELECT INTO 多个变量
- shell - 如何在带有 $* 的 shell 中使用带空格的路径
- javascript - 如何使用特定于环境的 firebase 配置来初始化 firebase 应用程序?
- javascript - HTML 标签与 React 中的 React 组件性能
- spring - “一对多”/“多对多”属性值类型不应该是“?延伸'
- python - 使用 Anaconda(1.15.4 或 1.14.0)安装 Pycbc 时版本不匹配
- python - Python - 如何更改默认的 os.sep?
- c++ - 如何在 SDI 应用程序的视图中插入多个 FormView
- javascript - Ajax 验证和 SyntaxError: JSON Parse error: Unrecognized token '<' on Laravel