gpt4 book ai didi

java - ImageView坐标与Bitmap像素的对应关系——Android

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:00 25 4
gpt4 key购买 nike

在我的应用程序中,我希望用户能够选择 ImageView 中包含的图像的某些内容。 .

为了选择我将 ImageView 子类化的内容类使其实现 OnTouchListener因此要在其上绘制一个矩形,其边框由用户决定。

这是绘图结果的示例(要了解其工作原理,您可以将其想象为在桌面上单击鼠标并拖动鼠标):

enter image description here

现在我需要确定 Bitmap 的哪些像素图像对应于所选部分。很容易确定哪些是 ImageView 的点。属于矩形,但我不知道如何获得对应的像素,因为ImageView具有与原始图像不同的纵横比。

我遵循了描述的方法 especially here , but also here ,但我并不完全满意,因为在我看来,ImageView 上的像素和点之间的对应关系是一对一的。并且不会将原始图像上的所有对应像素提供给所选区域。

调用 hoveredRect ImageView 上的矩形它里面的点是:

class Point {
float x, y;
@Override
public String toString() {
return x + ", " + y;
}
}

Vector<Point> pointsInRect = new Vector<Point>();

for( int x = hoveredRect.left; x <= hoveredRect.right; x++ ){
for( int y = hoveredRect.top; y <= hoveredRect.bottom; y++ ){

Point pointInRect = new Point();
pointInRect.x = x;
pointInRect.y = y;
pointsInRect.add(pointInRect);
}
}

如何获得 Vector<Pixels> pixelsInImage包含 Bitmap 的对应像素图片?


补充说明

我会更好地解释我的问题的背景:

I need to do some image processing on the selected part, and want to be sure that all the pixels in the rectangle get processed.

The image processing will be done on a server but it needs to know exactly which pixels to process. Server works with image with real dimensions, android app just tells which pixels to process to the server by passing a vector containing the pixel coordinates

为什么我不喜欢上面链接中提出的解决方案:

The answers given transform coordinates with a 1 to 1 fashion. This approach clearly is not valid for my task, since an area of say 50 points in the ImageView of a certain size on the screen cannot correspond to an area of the same number of pixels in the real image, but should consider the different aspect ratio.

例如,如果图像小于 ImageView,则应选择该区域在应用程序上显示:

enter image description here

最佳答案

马特奥,

这似乎更像是一个问题,您可以(主观地)容忍您发送到服务器的像素有多少错误。事实仍然是,对于任何不是一个漂亮整洁整数的纵横比,您必须决定向哪个方向“插入”您的选择框。

您链接到的解决方案是非常好的解决方案。您必须问自己:如果我处理的图像与屏幕上显示的选择框相差一个像素,用户会注意到吗?我的猜测可能不是。我无法想象用户在触摸屏上用粗大的手指选择矩形时无论如何都会有那种像素精度:D

既然是这种情况,我只让转换为整数时发生的 floor()-ing 处理您最终将哪些像素传递给服务器。

让我们看一个例子。

让我们将 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

现在,我将这个位图放在我的 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,然后大约进入像素的四分之一。好吧,如果我们 floor() 这个值和相应的 BitmapPixelY 值 8.36,我们将发送像素 (119, 8) 到服务器进行处理。如果我们要 ceil() 这些值,我们会将像素 (120, 9) 发送到服务器进行处理。 这是完全由您决定的部分。

您将(几乎)总是落在像素的某个小数部分。无论您是发送您登陆的像素,还是发送旁边的像素,都由您决定。我会说这将完全不会被您的用户注意到,因此重申一下,只需让转换为整数时发生的 floor()-ing 处理它。

希望对您有所帮助!

[编辑]

在更慢地再次阅读这个问题后,我想我更好地理解了你在问什么/感到困惑。我将使用上面的示例进行说明。

你是说 Bitmap 中有 176 个像素,ImageView 中有 400 个像素。因此,从一个到另一个的映射不是 1:1,这将导致在确定要提取哪些像素进行处理时出现问题。

但事实并非如此!当您将 ImageView 中矩形边界的坐标转换为位图中的坐标时,您只是提供像素范围以在位图中迭代 它不是描述 ImageView 中的每个单独像素如何映射到 Bitmap 中的相应像素。

我希望这能消除我对您的困惑。

关于java - ImageView坐标与Bitmap像素的对应关系——Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11334984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com