Как получить значение масштабирования произвольной матрицы?

Изображение масштабируется матрицей:

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] не является реалистичным значением масштабирования. Я использую его для вычисления новой ширины прямоугольника, это неверно.

Вместо этого я попытался сопоставить две точки по матрице и вычислить два расстояния:

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

Теперь я могу получить правильное значение scale . Но я не уверен, что это лучшее решение.

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

Это решение выглядит проще, но я думаю, что ваш гораздо более понятный и почти такой же быстрый, как этот.

Вы можете просто взять абсолютное значение

 Math.abs(mMatrixValues[Matrix.MSCALE_X]); 
Intereting Posts