Как преобразовать координаты вида изображения в координаты растрового изображения? - PullRequest
20 голосов
/ 08 февраля 2011

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

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

Ответы [ 6 ]

34 голосов
/ 30 марта 2012

это работает для меня по крайней мере с 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; }

31 голосов
/ 08 февраля 2011

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

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;

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

1 голос
/ 08 февраля 2011

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

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

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

float xScale = values[Matrix.MSCALE_X];

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

0 голосов
/ 24 апреля 2017

Получить этаж Ширина и высота

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

Рассчитать значение protionate

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

Ваш X & Y

float x = 315;
float y = 119;

Несколько с PropotionateValue

x = x * proportionateWidth;
y = y * proportionateHeight;
0 голосов
/ 04 ноября 2011

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

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

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

0 голосов
/ 08 февраля 2011

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

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