Как преобразовать координаты изображения в координаты растрового изображения?
В моем приложении мне нужно позволить пользователям проверить глаза на какой-то фотографии.
В OnTouchListener.onTouch(...) я получаю координаты ImageView.
Как я могу преобразовать эти координаты в точку в растровом изображении, которое было затронуто?
Ответы
Ответ 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;