Android将触摸点转换为图像上的实际位图点

时间:2014-09-13 04:44:32

标签: android image bitmap scale points

这是我的问题:

我有一个显示图片的Android应用程序。无论大小如何,图像本身都会调整为480 x 640。

用户可以单击图像的多个点。根据用户点击图像的位置,位图本身会对其应用一些变形。

因此,假设原始图像为1000 x 2000(使用整数使其更简单)。 将图像加载到ImageView后,它会缩放以在图像视图中正确显示。

对于具有不同分辨率的不同手机,这显然是不同的。

现在,当用户点击不同的点时,我最终希望将这些点与位图数据一起传递给我的WCF服务,以执行一些图像操作。

所以我的问题是如何获取用户触摸手机上的点并将其转换为相对于普通未缩放位图的点。

要点:

缩放位图以适应。用户点击100,100。 100,100是相对于缩放图像的点...而不是实际的位图本身。我正在寻找有关如何将100,100转换为实际位图上的点的指导。

提前感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

好的,所以Android ImageView的默认ScaleType为FIT_CENTER,这意味着:

public static final Matrix.ScaleToFit CENTER
  

计算将保持原始src宽高比的比例,但是   还将确保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);
}