使用矩阵旋转后获取位图的比例因子

时间:2011-10-23 16:28:09

标签: android graphics

我遇到了以下我试图解决的问题。 我将具有相应高度和宽度的Bitmap图片加载到ImageView中。 然后我使用矩阵来移动,缩放和旋转图像。 对于缩放我使用postScale方法。 为了移动我正在使用postTranslate方法。 仅用于旋转我正在使用preRotate方法。 现在我需要得到我用图像缩放图像的因子,因为我后来在另一个程序中需要这个因子。

使用矩阵的MSCALE_X和MSCALE_Y值只适用,直到我没有旋转。如果我旋转图像,则比例值不再适合(因为矩阵乘以api中显示的公式)。

现在我的问题是: 旋转后如何才能获得图像的比例因子?

对于旋转因子(度),它很简单,因为我将它存储在一个额外的变量中,该变量在旋转时被白化/减少。 但是对于比例因子它不起作用,因为如果我首先将图像缩小到50%然后将其重新缩放到150%然后我用3倍缩放它,但原始缩放因子仅为1.5)。

另一个例子是。即使我没有重新缩放图片,如果我旋转它也会改变它的缩放系数。

//编辑: 最后我自己解决了这个问题:)(做一些数学运算然后我想出了一些有趣的东西(或者让我们说明白了)。

这是我的解决方案: 我发现MSCALE_X和MSCALE_Y的值是使用cosinus函数计算的(是的基本数学......)。 (使用0°旋转会在X和Y内导致正确的scalingWidth和scalingHeight)。 (90°和270°导致缩放宽度/高度为0和180°导致缩放宽度/高度乘以-1)。

这使我想到编写以下函数: 此函数将当前矩阵保存在新矩阵中。然后它将新矩阵旋转到起始状态(0°)。现在我们可以在矩阵中读取非违反值MSCALE_X和MSCALE_Y(现在是正确的缩放因子)

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。这是一种简单的方法,逻辑是合理的(在我看来)。

对于:xScale==yScale

float scale = matrix.mapRadius(1f) - matrix.mapRadius(0f);

对于:xScale != yScale

float[] points={0f,0f,1f,1f};
matrix.mapPoints(points);
float scaleX=points[2]-points[0];
float scaleY=points[3]-points[1];

如果你没有进行翻译,你可以通过1f向量/点来逃避。我已经测试了xScale==yScale(mapRadius)变体,它似乎有效。

答案 1 :(得分:0)

我在写一个应用程序时遇到了类似的问题。我看不到一个明显的简单解决方案所以我只是创建了一个RectF对象,它具有相同的位图初始坐标。然后,每次调整矩阵时,我都会将变换应用到RectF(使用Matrix.mapRect())。这对我很有用。它还允许我跟踪位图边缘的绝对位置。