Получение масштабного коэффициента растрового изображения после вращения его с матрицей - PullRequest
1 голос
/ 23 октября 2011

У меня есть следующая проблема, которую я пытался решить целый день. Я загружаю растровое изображение с соответствующими ему высотой и шириной в ImageView. Затем я использую матрицу для перемещения, масштабирования и поворота изображения. Для масштабирования я использую метод postScale. Для перемещения я использую метод postTranslate. Только для Вращения я использую метод preRotate. Теперь мне нужно получить коэффициент, с которым я масштабировал изображение, потому что позже мне нужен этот фактор в другой программе.

Использование значений матрицы MSCALE_X и MSCALE_Y подходит только до тех пор, пока у меня не будет вращения. Если я повернул изображение, значения масштаба больше не соответствуют (потому что матрица умножалась на формулу, которая показана в API).

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

Для коэффициента вращения (градусы) это просто, потому что я храню его в дополнительной переменной, которая уменьшается / уменьшается во время вращения. Но для масштабного коэффициента это не работает, потому что, если я сначала уменьшу изображение до 50%, а затем масштабирую его до 150%, то я масштабировал его с коэффициентом 3, но исходный коэффициент масштабирования составляет всего 1,5).

Другой пример. Даже если я не изменил масштаб изображения, он даже изменит коэффициент масштабирования, если я поверну его.

// Изменить: В конце концов, я решил проблему самостоятельно :) (немного по математике, а потом понял что-то интересное (или, скажем, очевидное)).

Вот мое решение: Я понял, что значения MSCALE_X и MSCALE_Y вычисляются с помощью функции косинуса (да, базовая математика ...). (Использование поворота на 0 ° приводит к правильному scalingWidth и scalingHeight в пределах X и Y). (90 и 270 ° приводит к scalingWidth / Height, равному 0 и 180 °, приводит к scalingWidth / Height, умноженному на -1).

Это приводит меня к мысли написать следующую функцию: Эта функция сохраняет текущую матрицу в новой матрице. Затем он поворачивает новую матрицу в начальное состояние (0 °). Теперь мы можем прочитать не нарушенные значения MSCALE_X и MSCALE_Y в нашей матрице (которые сейчас являются правильными коэффициентами масштабирования)

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

У меня была такая же проблема. Это простой способ, и логика логична (на мой взгляд).

Для: 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), и он, кажется, работает.

0 голосов
/ 01 декабря 2011

У меня была похожая проблема с приложением, которое я пишу.Я не видел очевидного простого решения, поэтому я просто создал объект RectF с такими же начальными координатами растрового изображения.Затем, каждый раз, когда я настраивал матрицу, я также применял преобразование к RectF (используя Matrix.mapRect ()).Это отлично сработало для меня.Это также позволило мне отслеживать абсолютное положение краев растрового изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...