- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的应用程序中,我希望用户能够选择 ImageView
中包含的图像的某些内容。 .
为了选择我将 ImageView
子类化的内容类使其实现 OnTouchListener
因此要在其上绘制一个矩形,其边框由用户决定。
这是绘图结果的示例(要了解其工作原理,您可以将其想象为在桌面上单击鼠标并拖动鼠标):
现在我需要确定 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
,则应选择该区域在应用程序上显示:
最佳答案
马特奥,
这似乎更像是一个问题,您可以(主观地)容忍您发送到服务器的像素有多少错误。事实仍然是,对于任何不是一个漂亮整洁整数的纵横比,您必须决定向哪个方向“插入”您的选择框。
您链接到的解决方案是非常好的解决方案。您必须问自己:如果我处理的图像与屏幕上显示的选择框相差一个像素,用户会注意到吗?我的猜测可能不是。我无法想象用户在触摸屏上用粗大的手指选择矩形时无论如何都会有那种像素精度: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/
下面的说法正确吗? “人最好的 friend 是狗。” public class Mann { private BestFriend dog; //etc } 最佳答案 我想说这样
我一直在 documentation 中查看 Laravel 4 中的关系我正在尝试解决以下问题。 我的数据库中有一个名为“事件”的表。该表具有各种字段,主要包含与其他表相关的 ID。例如,我有一个“
我的表具有如下关系: 我有相互链接的级联下拉框,即当您选择国家/地区时,该国家/地区下的区域将加载到区域下拉列表中。但现在我想将下拉菜单更改为基于 Ajax 的自动完成文本框。 我的问题是,我应该有多
我正在尝试弄清楚如何构建这个数据库。我之前用过Apple的核心数据就好了,现在我只是在做一个需要MySQL的不同项目。我是 MySQL 的新手,所以请放轻松。 :) 对于这个例子,假设我有三个表,Us
MongoDB 的关系表示多个文档之间在逻辑上的相互联系。 文档间可以通过嵌入和引用来建立联系。 MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多)
您能解释一下 SQL 中“范围”和“分配单元”之间的区别或关系吗? 最佳答案 分配单元基本上只是一组页面。它可以很小(一页)或很大(很多页)。它在 sys.allocation_units 中有一个元
我有一个表 geoLocations,其中包含两列纬度和经度。还有第二个表(让我们将其命名为城市),其中包含每对唯一的纬度和经度对应的城市。 如何使用 PowerPivot 为这种关系建模?创建两个单
我想用 SQLDelight 建模关系,尤其是 一对多关系。 我有 2 张 table :recipe和 ingredient .为简单起见,它们看起来像这样: CREATE TABLE recipe
我是 Neo4J 新手,我有一个带有源和目标 IP 的简单 CSV。我想在具有相同标签的节点之间创建关系。 类似于... source_ip >> ALERTS >> dest_ip,或者相反。 "d
我正在创建一个类图,但我想知道下面显示的两个类之间是否会有任何关联 - 据我了解,对于关联,ClassA 必须有一个 ClassB 的实例,在这种情况下没有但是,它确实需要知道 ClassB 的一个变
是否可以显示其他属性,即“hasTopping”等? 如何在 OWLViz 中做到这一点? 最佳答案 OWLViz 仅 显示类层次结构(断言和推断的类层次结构)。仅使用“is-a”关系进行描述。 OW
public class MainClass { ArrayList mans = new ArrayList(); // I'm filling in this arraylist,
我想知道“多对二”的关系。 child 可以与两个 parent 中的任何一个联系,但不能同时与两个 parent 联系。有什么办法可以加强这一点吗?我也想防止 child 重复条目。 一个真实的例子
我有一个已经创建的Grails插件,旨在支持许多应用程序。该插件具有一个Employee域对象。问题在于,当在主应用程序中使用该应用程序中的域对象时,需要将其引用回Employee对象。因此,我的主应
我有一个类(class)表、类(class)hasMany部分和部分hasMany讲座以及讲座hasMany评论。如果我有评论 ID 并且想知道其类(class)名称,我应该如何在 LectureCo
我有一个模型团队,包含 ID 和名称。所有可能的团队都会被存储。 我的模型游戏有两列 team_1 和 team_2..我需要哪种关系? 我已经测试了很多,但它只适用于一列.. 最佳答案 也许你可以试
我读了很多关于 ICE 或 Corba 等技术中使用的仆人和对象的文章。有很多资源我可以读到这样的东西: 一个仆人可以处理多个对象(为了节省资源)。 一个对象可以由多个仆人处理(为了可靠性)。 有人可
嗨, 我有一个令人沮丧的问题,我在这方面有点生疏。我有两个这样的类(class): class A{ int i; String j ; //Getters and setters} class B
class Employee { private String name; void setName(String n) { name = n; } String getNam
如果您有这样的关系: 员工与其主管员工之间存在多对一关系 员工与其部门的多对一关系 部门与其经理一对一 我会在 Employee 实体中写入: @ManyToOne (cascade=CascadeT
我是一名优秀的程序员,十分优秀!