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

Как преобразовать координаты изображения в координаты растрового изображения?

В моем приложении мне нужно позволить пользователям проверить глаза на какой-то фотографии. В OnTouchListener.onTouch(...) я получаю координаты ImageView.

Как я могу преобразовать эти координаты в точку в растровом изображении, которое было затронуто?

4b9b3361

Ответ 1

Хорошо, поэтому я не пробовал это, но немного подумал, вот что у меня есть как предложение:

ImageView imageView = (ImageView)findViewById(R.id.imageview);
Drawable drawable = imageView.getDrawable();
Rect imageBounds = drawable.getBounds();

//original height and width of the bitmap
int intrinsicHeight = drawable.getIntrinsicHeight();
int intrinsicWidth = drawable.getIntrinsicWidth();

//height and width of the visible (scaled) image
int scaledHeight = imageBounds.height();
int scaledWidth = imageBounds.width();

//Find the ratio of the original image to the scaled image
//Should normally be equal unless a disproportionate scaling
//(e.g. fitXY) is used.
float heightRatio = intrinsicHeight / scaledHeight;
float widthRatio = intrinsicWidth / scaledWidth;

//do whatever magic to get your touch point
//MotionEvent event;

//get the distance from the left and top of the image bounds
int scaledImageOffsetX = event.getX() - imageBounds.left;
int scaledImageOffsetY = event.getY() - imageBounds.top;

//scale these distances according to the ratio of your scaling
//For example, if the original image is 1.5x the size of the scaled
//image, and your offset is (10, 20), your original image offset
//values should be (15, 30). 
int originalImageOffsetX = scaledImageOffsetX * widthRatio;
int originalImageOffsetY = scaledImageOffsetY * heightRatio;

Попробуйте эту идею и посмотрите, работает ли она для вас.

Ответ 2

это работает для меня, по крайней мере, с API 10+:


final float[] getPointerCoords(ImageView view, MotionEvent e)
{
    final int index = e.getActionIndex();
    final float[] coords = new float[] { e.getX(index), e.getY(index) };
    Matrix matrix = new Matrix();
    view.getImageMatrix().invert(matrix);
    matrix.postTranslate(view.getScrollX(), view.getScrollY());
    matrix.mapPoints(coords);
    return coords;
}

Ответ 3

помимо учета смещения из-за заполнения (маржа является частью макета, она выходит за пределы представления и не должна учитываться), если изображение масштабируется, вы можете получить матрицу изображения (ImageView.getImageMatrix()) до масштабные координаты.

ИЗМЕНИТЬ: Вы можете получить коэффициент масштабирования x/y и сумму перевода, получая массив значений и используя соответствующие индексные константы:

float[] values;
matrix.getValues(values);

float xScale = values[Matrix.MSCALE_X];

Обратите внимание, что перевод не включает прописку, вам все равно придется учитывать это отдельно. перевод используется, например, в масштабировании FIT_CENTER, когда имеется некоторое "пустое" пространство.

Ответ 4

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

Ответ 5

Чтобы добавить к ответу kcoppock, я просто хочу добавить, что:

//original height and width of the bitmap
int intrinsicHeight = drawable.getIntrinsicHeight();
int intrinsicWidth = drawable.getIntrinsicWidth();

может вернуть ответ, которого вы не ожидаете. Эти значения зависят от dpi в выпадающей папке, из которой вы загружаете изображение. Например, вы можете получить другое значение, если загрузите изображение из /drawable vs/drawable-hdpi vs/drawable-ldpi.

Ответ 6

Получить ширину и высоту пола

float floorWidth = floorImage.getWidth();
float floorHeight = floorImage.getHeight();

Рассчитать пронионированное значение

float proportionateWidth = bitmapWidth / floorWidth;
float proportionateHeight = bitmapHeight / floorHeight;

Ваши X и Y

float x = 315;
float y = 119;

Несколько с PropotionateValue

x = x * proportionateWidth;
y = y * proportionateHeight;