利玛窦,
这似乎是一个问题,您可以(主观地)容忍您发送到服务器的像素有多少错误.事实上,对于任何不会出现一个漂亮整洁整数的宽高比,您必须决定“推”选择框的方向.
您链接的解决方案是完美的解决方案.你必须问自己:用户是否注意到,如果我处理的图像是从屏幕上显示的选择框中的一个像素?我的猜测可能不是当用触摸屏上的大胖手指选择一个矩形时,我无法想像用户将具有像素精度:D
由于是这种情况,所以我可以让抛出一个整数时发生的floor() – 来处理最终传递给服务器的像素.
我们来看一个例子.
让我们将ImageView和Bitmap的宽度和高度定义为:
ImageViewWidth = 400, ImageViewHeight = 150
BitmapWidth = 176, BitmapHeight = 65
然后,您将使用它们在其间转换选择框的宽高比为:
WidthRatio = BitmapWidth / ImageViewWidth = 175 / 400 = 0.44
HeightRatio = BitmapHeight / ImageViewHeight = 65 / 150 = 0.44
一些不错的丑陋的数字. ImageView中的任何像素都将对应于Bitmap中的像素,如下所示:
BitmapPixelX = ImageViewPixelX * WidthRatio
BitmapPixelY = ImageViewPixelY * HeightRatio
现在我把这个Bitmap放在我的ImageView的屏幕上,供用户选择一个矩形,用户在ImageView中选择一个有左上角和右下角坐标的矩形:
RectTopLeftX = 271, RectTopLeftY = 19
RectBottomRightX = 313, RectBottomRightY = 42
如何确定位图中哪些像素对应?简单.我们之前确定的比率.现在我们来看看左上角的坐标.
RectTopLeftX * WidthRatio = 271 * .44 = 119.24
RectTopLeftY * HeightRatio = 19 * .44 = 8.36
对于RectTopLeftX,我们发现我们的BitmapPixelX值为119,然后是四分之一的像素.那么,如果我们把这个值和对应的BitmapPixelY的值为8.36,我们将把像素(119,8)发送到服务器进行处理.如果我们要ceil()这些值,我们将发送像素(120,9)到服务器进行处理.这是完全取决于你的部分.
你将(几乎)总是落在像素的一些小数部分.无论你发送你所在的像素,还是旁边的像素是你的电话.我会说这是你的用户完全不明显的,所以要重申一下,只要让抛出一个整数就会发生的floor() – .
希望有帮助!
[编辑]
再次慢慢阅读这个问题,我想我更好的理解你的问题/困惑.我将用上面的例子来说明.
您说的是Bitmap中有176个像素,ImageView中有400个像素.因此,从一个到另一个的映射不是1:1,这将在找出要提取的像素进行处理时会产生问题.
但它不!当您将ImageView中的矩形边界的坐标转换为位图中的坐标时,您只需在“位图”中给出像素范围即可迭代.它不是描述ImageView中每个像素如何映射到Bitmap中相应的像素.
我希望清除我对你的困惑的困惑.