2016-05-07 3 views
1

Скажем, я начинаю с Bitmap, что это 1000px х 1000pxЕсть ли способ перевести матрицу в альтернативный масштаб?

я загрузить его в SurfaceViewCanvas жителя, который отображается в некоторых произвольных (и в зависимости от устройства различных размеров).

Я могу получить эти измерения во время выполнения и измерить масштаб между ними и оригиналом (если мне нужна эта информация в конце).

Затем я разрешаю пользователю зажимать/масштабировать/переводить изображение вокруг отображаемого холста. Все время у меня есть Matrix, который отслеживает и используется для повторного рисования изображения в отображаемой области экрана.

Впоследствии эти значения Matrix применяются к масштабированному пространству (а не оригинальному графику 1000x1000).

Пока все хорошо - у меня все это работает.

Однако, когда все сказано и сделано, я хотел бы применить эту матрицу к исходному растровому изображению и сохранить его. Однако я не понимаю, как изменить все свои внутренние значения, чтобы применить его к размеру безмасштабированного оригинала (1000x1000).

Любопытный, если есть какой-то автомагический способ их перевести, или если мне нужно каким-то образом применить каждое значение на основе шкалы между двумя размерами обратно к новой матрице.

+0

Ортогональных на ваш вопрос, но, возможно, использование: http://android-developers.blogspot.com/2013/09/using-hardware-scaler-for-performance.html – fadden

+0

я предполагаю, что вы используете ' Canvas # drawBitmap (Bitmap, Matrix, Paint) 'для рисования на вашем SurfaceView', затем используйте тот же метод при рисовании временного« Bitmap », а затем сохраните его – pskink

+0

@pskink, я, но вы видите - это приведет к во всех значениях неверно! Предположим, что пользователь переместил изображение 50px вправо (на экране) - это переводит на некоторое количество положительного движения по оси X в том, что будет последним, потому что 50 пикселей экрана имеют некоторую долю (большую или меньшую), чем фактический битмап. Поэтому мне нужно повторно передать всю матрицу обратно в исходные размеры (сохраняя измененные пользователем изменения) –

ответ

2

Для того, чтобы инвертировать матрицу

матрицу {а, б, в, г, д, е} и обратное матрица {IA, IB, IC, ID, то есть, если}

var cross = a * d - b * c; 
    ia = d/cross; 
    ib = -b/cross; 
    ic = -c/cross; 
    id = a/cross; 
    ie = (c * f - d * e)/cross; 
    if = -(a * f - b * e)/cross; 

Обратное преобразование, исходное из координат изображения в координаты экрана и обратная матрица преобразует координаты экрана в координаты изображения.

Если у вас есть преобразование на экране, и вы хотите знать, где на изображении находится верхняя левая часть экрана. Получите обратное преобразование и примените его к координате экрана (0,0) вверху слева.

scrX = ? 
scrY = ? 
imageX = scrX * ia + scrY * ic + ie; 
imageY = scrX * ib + scrY * id + if; 
+0

У меня возникает соблазн подумать, что это действительно отвечает на мой вопрос, но я не уверен, что так оно и есть. Моя «Матрица» применяется к тому, что в настоящее время отображается на экране.Я должен сделать это, чтобы перевести его обратно в исходную шкалу Bitmap, которую манипулирует пользователем на экране. Таким образом, исходное изображение X на Y, а на экране оно отображается в любых размерах экрана, а «Матрица» - относительно этих размеров экрана. Применяется ли ваше решение к этому сценарию, и если да, то бы вы были настолько любезны, чтобы выложить фактический синтаксис преобразования Матрицы? –

+0

@GeniaS. Если вы хотите, чтобы на изображении была координата экрана, тогда да. Например, если вам нужны координаты изображения для координаты экрана, где верхняя/левая (0,0), верхняя/правая (199,0), нижняя/правая (199,399) и нижняя/левая (0,299), умножьте каждую координату (как второй фрагмент показывает) обратным преобразованием, и вы получите координаты изображения для каждого угла, включая поворот, масштабирование и перевод. Вам понадобится доступ к текущему преобразованию (я не использовал устройство Android, поэтому не могу помочь вам с кодом) – Blindman67

+0

Большое спасибо. Android не имеет значения для деталей. В самом деле, мне нужно, чтобы отображаемое изображение (независимо от его размеров дисплея) отображалось обратно в исходный прямоугольник Bitmap, но сохраняло поворот/трансляцию/масштабирование, которые были применены к отображаемому элементу. Я должен убедиться, что класс Matrix в Android отображает ваши a, b, c, d и т. Д. Для массива, который вы начертите в своем решении, или можете ли вы подтвердить, что это так? –

Смежные вопросы