1

有一个 ImageView,它有一个 Image,它已被缩放和旋转。

看图片:

在此处输入图像描述

图像按比例缩放android.graphics.Matrix

你可以看到有一个红色的点是图像的中心点,还有一个蓝色的边框。如何计算它们?

(更新:我想对蓝色边框内的女孩图像进行操作,而不是整张图片,那是背景)

4

1 回答 1

2

两者之间存在数学依赖关系。如果有其他可用信息:-假设矩形的所有角都有直角-。

center.X = (aCorner.X + oppositeCorner.X)/2;
center.Y = (aCorner.Y + oppositeCorner.Y)/2;

其中 aCorner 是任意角,且对角是 aCorner 的对角。

这是微不足道的,包括计算边界的更多艰苦工作(以及更多信息;中心位置,图片的宽度和高度以及旋转角度)。假设图像的宽度为“w”,高度为“h”,角度为“a”,中心为“cX”和“cY”。第一个角落;

length = sqrt(w^2+h^2)/2;
x = (length)*(cos(a)*(-w/length) - (h/length)*sin(a)) + cX;
y = (length)*(sin(a)*(-w/length) + (h/length)*cos(a)) + cY;

第二个角落;

x = (length)*(cos(a)*(w/length) + sin(a)*(h/length)) + cX;
y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY;

第三;

x = -(length)*(cos(a)*(-w/length) + (h/length)*sin(a)) + cX;
y = -(length)*(sin(a)*(-w/length) - (h/length)*cos(a)) + cY;

第四;

x = -(length)*(cos(a)*(w/length) - sin(a)*(h/length)) + cX;
y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY;

长度是矩形对角线的一半。cos和sin的内部是三角变换的结果:

sin(a+b) = sin(a)*cos(b) + cos(a)*sin(b)
[....]

cX 和 cY 用于将角点从任意坐标系转换到特定坐标系。

我知道,我知道这有点矫枉过正。Matrix 类可能有它自己的这些功能。我相信如果有,其中使用的方法可以分解为我在这里描述的方法。

注意:角度 a - 实际上甚至是 sin(a) 和 cos(a),这更好 - 可以通过
Matrix.getValues(float[] values)访问

大多数 2D 矩阵使用这种方案:

| sin(a) 0       0    |
| 0      -cos(a) 0    |
| 0      0       scale|

我不确定 Android API 的特定实现。

顺便说一句,上面可能有一些签名错误,所以要小心。

于 2012-09-02T12:15:48.813 回答