5

画像はマトリックスによってスケーリングされます。

Matrix matrix = new Matrix();
matrix.postScale(...);
matrix.postTranslate(...);
matrix.postRotate(...);
...

ズームした画像が元の画像の半分を下回らないようにしたいと思います。したがって、ズームの合計は0.5を下回らないようにする必要があります。

しかし、それを行う方法は?チェックする行列の最初の値を取得しようとしました:

float pendingZoom = 0.6f;

float[] values = new float[9];
Matrix.getValues(values);
float scalex = values[Matrix.MSCALE_X];

それで:

if(scalex<0.5) {
    pendingZoom = pendingZoom * (0.5f / scalex);
}

残念ながら、動作しない場合があります。画像が回転している場合、はscalexネガティブにpendingZoomなる可能性があり、もネガティブになります。

これを正しく行う方法は?


アップデート

values[Matrix.MSCALE_X]は、実現可能なズーム値ではないことがわかりました。長方形の新しい幅を計算するために使用しますが、正しくありません。

代わりに、マトリックスによって2つのポイントをマッピングし、2つの距離を計算しようとしました。

PointF newP1 = mapPoint(matrix, new PointF(0, 0));
PointF newP2 = mapPoint(matrix, new PointF(width, 0));
float scale = calcDistance(newP1, newP2) / width;

scale私は今正しい値を得ることができます。しかし、それが最善の解決策かどうかはわかりません。

4

2 に答える 2

8
    float scalex = values[Matrix.MSCALE_X];
    float skewy = values[Matrix.MSKEW_Y];
    float scale = (float) Math.sqrt(scalex * scalex + skewy * skewy);

この解決策はより単純に見えますが、あなたの解決策はこれよりもはるかに明確で、ほぼ同じくらい速いと思います。

于 2012-09-04T09:28:27.353 に答える
0

あなたは絶対値を取ることができます

Math.abs(mMatrixValues[Matrix.MSCALE_X]);
于 2016-07-25T11:35:47.063 に答える