2014-09-13 4 views
0

вот моя проблема:Android конвертирует точки касания в фактические растровые точки на изображении

У меня есть приложение для Android, которое отображает изображение. Само изображение изменяется до 480 x 640 независимо от размера.

Пользователь может нажать на несколько точек изображения. Основываясь на том, где пользователь нажимает на изображение, у самого растрового изображения есть какое-то деформирование.

Итак, исходное изображение 1000 х 2000 (с использованием целых чисел, чтобы упростить его). Как только изображение загружается в ImageView, оно масштабируется для правильного отображения изображения.

Это, очевидно, отличается для разных телефонов с различными разрешениями.

Теперь, когда пользователь нажимает на разные точки, я в конечном итоге хочу передать эти точки в мою службу WCF вместе с растровыми данными для выполнения некоторых манипуляций с изображениями.

Таким образом, для меня проблема заключается в том, как взять точки, где пользователь коснулся телефона и преобразовать их в точки, которые относятся к нормальному немасштабированному растровому изображению.

Резюме:

Bitmap масштабируется. Пользователь щелкает по 100 100. 100 100 - это точка относительно масштабированного изображения ... не фактическое растровое изображение. Я ищу руководство относительно того, как преобразовать 100 100 в точку реального растрового изображения.

Заранее благодарим за любую помощь, которую вы можете дать.

+0

- изображение масштабируется так, чтобы соотношение сохранялось или просто идеально вписывалось в поле 480x640? – Dave

+0

Hi Dave ... изображение не масштабируется. Он просто загружен в типичный ImageView. Он масштабируется прямо перед отправкой в ​​службу REST. Поэтому, в конечном счете, пользователь нажимает точки на телефоне. Эти точки относятся к ImageView. Перед отправкой изображения в службу REST для обработки изображений я масштабирую его до 480 x 640 с RATIO PRESERVED. Мне нужны те точки, которые я нажал на изображение, которое нужно преобразовать относительно изображения 480 x 640. Извините, если это не имеет смысла. я пытаюсь объяснить это без чрезмерного объяснения, если вы знаете, что я имею в виду. Спасибо – tronious

ответ

0

нормально, так что Android ImageView имеет ScaleType по умолчанию FIT_CENTER, так что это означает:

public static final Matrix.ScaleToFit CENTER 

Compute шкала, которая будет поддерживать исходное соотношение сторон Src, но также гарантирует, что в исходные тексты припадки полностью внутри dst. По крайней мере одна ось (X или Y) будет точно соответствовать. Результат центрирован внутри dst.

так что если вы весь вид изображения имеет 480x640 для показа изображения, и, например, ваше изображение 1000x2000, то:

2000/640 = scaleFactor = 3.125/1 

так ширина будет масштабироваться до 320 уходящих 80 пикселей на любом боковая пустая, поэтому она может поддерживать соотношение сторон.

//this one will be 80. 
int xBuffer= (imageViewWidth - (realImageWidth*scaleFactor))/2; 
//this one will be zero in your example  
int yBuffer = (imageViewHeight - (realImageHeight*scaleFactor))/2; 


int imageViewX = 0;//x coord where on the image view it was clicked 
int imageViewY = 0;//y coord where on the image view it was clicked 

if (imageViewX < xBuffer || imageViewX > imageViewWidth-xBuffer) 
{ 
    //ignore the click, outside of your image. 
} 
else if (imageViewY < yBuffer || imageViewY > imageViewHeight-yBuffer) 
{ 
    //ignore the click, outside of your image. 
} 
else 
{ 
    realImageY = imageViewY * scaleFactor; 
    realImageX = (imageViewY - 80) * scaleFactor; 
    //save click somehow.. 
    saveClick(realImageX,realImageY); 
} 
+0

Дэйв действительно оценил ответ. Я собираюсь поиграть с этим, если это сработает для меня. Если да, я быстро приму ваш ответ. Если нет, у меня может возникнуть еще несколько вопросов относительно вашего ответа. Еще раз спасибо – tronious

+0

Дэйв большое спасибо за ответ. Это очень помогло мне. Mark – tronious

Смежные вопросы