Подтвердить что ты не робот

Область изображения Warp при касании точки?

Мне нужна основная идея, как я могу деформировать изображение при прикосновении к определенной области. Фильтры изображения применяют деформацию всего изображения, но я хочу деформировать единую точку, например, если я хочу исказить глаз человека, тогда я коснусь этого момента. Поэтому мне нужно базовое представление об этой работе.

Я пробовал этот, но он также применяет фильтры для всего изображения. https://github.com/Jtfinlay/PhotoWarp

Приложение: https://play.google.com/store/apps/details?id=hu.tonuzaba.android&hl=en

4b9b3361

Ответ 1

Основание не только в "одной точке", но и в некоторой области, которую вы деформируете плавным образом.

Чтобы достичь этого, вам нужно геометрическое преобразование координат, которое работает в некоторой окрестности затронутой точки. Один из способов сделать это - применить квадратную сетку на изображении и перемещать узлы сетки вокруг затронутых точек с помощью какого-либо вашего закона (например, применить вектор перемещения ко всем узлам с коэффициентом затухания таким образом, чтобы отдаленные узлы надежно 't move).

Затем вам нужна функция передискретизации, которая вычисляет новые координаты каждого пикселя и копирует цвет исходного пикселя.

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

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

Последняя вещь: в подходе к сетке см. смещения узлов сетки как две скалярные функции DX (i, j) и DY (i, j), которые вы можете обрабатывать отдельно. По знанию перемещений в узлах вы можете оценить смещение любого пикселя путем интерполяции (бикубический будет здесь уместным).

Ответ 2

вы можете использовать холст, чтобы обнаружить эту часть и остановить действие на этой части в ontouchlistener

пример кода

Bitmap pricetagBmp = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.ic_tag_circle_24dp);
           // canvas.drawBitmap(pricetagBmp,left + (right - left) / 2, top + (bottom - top) / 2 - (bounds.height() / 2),circlePaint);
            float imageStartX = (left + ((right-left)/2)) - (pricetagBmp.getWidth()/2);
            float  imageStartY = (top + ((bottom - top) / 2)) - (pricetagBmp.getHeight()/2);
            canvas.drawBitmap(pricetagBmp, imageStartX,  imageStartY,circlePaint);

и в ontouchlistener, если обнаруженные точки не могут выполнять никакие действия

Примечание: вы можете заменить drawBitmap на drawRect или что-то еще с невидимым цветом