Использование Android Canvas.drawBitmapMesh дает неожиданное преобразование растрового изображения - PullRequest
0 голосов
/ 07 декабря 2018

Используя Canvas.drawBitmapMesh(), я могу изменить изображение для имитации изменения перспективы, но способ изменения изображения является неожиданным.

Исходное изображение> Преобразованное изображение

Original Image >>>>> Преобразование «Один за другим» >>>> One by One Mesh

canvas.drawBitmapMesh(myBitmap, 1, 1, fourPoints, 0, null, 0, null);

int[] fourPoints соответствует размерам myBitmap, за исключением верхнеголевая точка смещена вправо, а верхняя правая точка смещена влево.

POINT: 768.0, 0.0
POINT: 2304.0, 0.0
POINT: 0.0, 2304.0
POINT: 3072.0, 2304.0

Обратите внимание, что на изображении справа вверху неожиданно появилось диагональное сгибание.Это, в отличие от изображения, которое я сгенерировал ниже (без использования Android Canvas drawBitmapMesh).

Ожидаемое преобразование:

Expected

Я назову ожидаемый выше результат преобразованием 'плавные линии' .

Увеличение сетки

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

Сетка два на два

Using a two by two mesh

canvas.drawBitmapMesh(myBitmap, 2, 2, ninePoints, 0, null, 0, null);

int[] ninePoints соответствует размерам myBitmap внизу, но остальные отрегулированы для создания трапеции.

POINT: 768.0, 0.0
POINT: 1536.0, 0.0
POINT: 2304.0, 0.0
POINT: 384.0, 1152.0
POINT: 1536.0, 1152.0
POINT: 2688.0, 1152.0
POINT: 0.0, 2304.0
POINT: 1536.0, 2304.0
POINT: 3072.0, 2304.0

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

1 Ответ

0 голосов
/ 12 января 2019

Для этого необходимо использовать матрицу перспективы.

Инициировать матрицу, которая преобразует исходные точки в точки назначения (должно быть 4 точки):

Matrix m = new Matrix();
m.setPolyToPoly(srcPoints,0,dstPoints,0,4)

Где исходные и конечные точкиплавающие массивы точек, представленные как {x1, y1, x2, y2, x3, y3, x4, y4}

, а затем рисование с

canvas.drawBitmapMesh(myBitmap, m, null);

null может быть заменено объектом Paint, который можетбыть определенным для использования фильтра сглаживания.

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