¿Cómo convertir las coordenadas de la vista de la imagen a las coordenadas del bitmap?

En mi aplicación, necesito permitir que los usuarios revisen los ojos en alguna foto. En OnTouchListener.onTouch (…) obtengo las coordenadas de ImageView.

¿Cómo puedo convertir estas coordenadas al punto en el bitmap que se tocó?

De acuerdo, entonces no lo intenté, pero pensándolo bien, esto es lo que tengo como sugerencia:

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 //(eg 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; 

Pruebe esta idea y vea si funciona para usted.

esto funciona para mí al menos con API 10+:

 flotación final [] getPointerCoords (vista de ImageView, e de MotionEvent)
 {
     índice int final = e.getActionIndex ();
     float final [] coords = new float [] {e.getX (index), e.getY (index)};
     Matrix matrix = new Matrix ();
     view.getImageMatrix (). invert (matriz);
     matrix.postTranslate (view.getScrollX (), view.getScrollY ());
     matrix.mapPoints (coords);
     cuerdas de retorno;
 }

además de considerar el desplazamiento debido al relleno (el margen es parte del diseño, es espacio fuera de la vista y no tiene que ser considerado), si la imagen se escala puede obtener la matriz de la imagen ( ImageView.getImageMatrix() ) para escalar coordenadas

EDITAR : Puede obtener el factor de escala x / y la cantidad de traducción obteniendo los valores de matriz y usando las respectivas constantes de índice:

 float[] values; matrix.getValues(values); float xScale = values[Matrix.MSCALE_X]; 

tenga en cuenta que la traducción no incluye el relleno, aún debería tenerlo en cuenta por separado. la traducción se usa, por ejemplo, en escala FIT_CENTER cuando hay un espacio “en blanco”.

Diría que probablemente necesite compensar las coordenadas de ImageView con cualquier margen o márgenes en el diseño para obtener las coordenadas correctas de BitMap.

Para agregar a la respuesta de Kcoppock, solo quiero agregar que:

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

puede devolver una respuesta que no estás esperando. Estos valores dependen del dpi de la carpeta dibujable desde la que carga la imagen. Por ejemplo, puede obtener un valor diferente si carga la imagen de / drawable vs / drawable-hdpi vs / drawable-ldpi.

Obtener el ancho y la altura del piso

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

Calcular el valor de protionate

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

Tu X e Y

 float x = 315; float y = 119; 

Múltiple con PropotionateValue

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