在我的应用我希望用户能够选择包含内部图像的某些内容ImageView
。
要选择内容我子类的ImageView
类使其实现OnTouchListener
等过它来绘制一个矩形由用户决定的边界。
这里是描绘结果的一个例子(有它的工作原理,你可以把它当你与你的桌面上的鼠标点击并拖动鼠标作为一个想法):
现在我需要确定哪个的像素 Bitmap
图像对应于所选择的部分。 这是一种很容易确定哪些是的点ImageView
属于长方形,但我不知道怎么去对应的像素,由于ImageView
具有不同的纵横比的原始图像。
我跟着描述的方法特别是在这里 , 而且这里 ,但我并不完全满意,因为在我看来取得了对应的是1上的像素和点之间的1 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
图像?
ADDED解释
我会解释我的问题,好一点的背景:
我需要做的选定部分的一些图像处理,并希望确保在矩形的所有像素得到处理。
图像处理将在服务器上进行,但它需要确切地知道哪些像素处理。 服务器可与图像的实际尺寸,Android应用程序只是告诉哪些像素处理服务器使含有像素坐标矢量
为什么我不喜欢在上面的链接提出的解决方案:
给出的答案中的坐标转换为1比1的方式。 这种方法显然不适用于我的任务,因为面积说,在50分ImageView
屏幕不能对应相同数量的真实图像像素的面积上具有一定规模的,但应考虑不同的纵横比。
如实施例,这是应该选择如果图像是比小的区域ImageView
上的应用程序显示:
利玛窦,
看来这是一个多大的错误,您可以(主观)容忍将像素发送到服务器的更多的问题。 事实是,任何纵横比不出来一个漂亮整洁的整数,你要哪个方向决定“推”你的选择框。
您链接到的解决方案是非常好的解决方案。 你要问自己:请问,如果我的形象过程中从屏幕上显示的选择框是一个像素注销该用户的通知? 我的猜测是可能不会。 我无法想象选择与在触摸屏上的大胖子的手指一个矩形,当用户将拥有那种像素精度不管怎么说:d
既然是这样的话,我只想让floor()
是铸造为整数时要小心其中的像素,你最终传递到服务器发生-ing。
让我们来看一个例子。
让我们来定义的ImageView和位图的宽度和高度为:
ImageViewWidth = 400, ImageViewHeight = 150
BitmapWidth = 176, BitmapHeight = 65
然后,纵横比,你会用你的选择框转换它们之间将是:
WidthRatio = BitmapWidth / ImageViewWidth = 175 / 400 = 0.44
HeightRatio = BitmapHeight / ImageViewHeight = 65 / 150 = 0.44
一些不错的难看的数字。 无论象素我是在ImageView的将对应一个像素的位图,如下所示:
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,我们发现自己在119 BitmapPixelX值,然后约的方式进入像素的四分之一。 那么,如果我们floor()
此值和8.36的相应BitmapPixelY值,我们将发送像素(119, 8)
到服务器以进行处理。 如果我们ceil()
这些值,我们将发送像素(120,9)发送到服务器以进行处理。 这是完全取决于你的一部分。
您将(几乎)总是在一个像素中的一些小数部分土地。 无论你发送你的土地在像素,或者一个旁边是你的电话。 我会说,这是怎么回事你的用户是完全无法察觉,因此重申,只是让floor()
是铸造成整数的时候照顾它发生-ing。
希望帮助!
[编辑]
在再次阅读问题比较慢,我想我更明白你问/无所适从。 我会用我上面的例子来说明。
您是说有176个像素的位图,以及400个像素的ImageView的。 因此,从一个到另一个映射不是1:1,并找出哪些像素拉出来进行处理时,这会导致问题。
但事实并非如此! 当您转换的矩形范围的坐标中的ImageView的位图的坐标,你只是给人的像素范围 的位图遍历。 这不是如何在ImageView的每个像素映射到的位图的相应像素的描述。
我希望澄清了我的困惑你的困惑。
这是可以解决的非常简单的数学,您的矩形有4个点P1,P2,P3,P4,具有坐标x,y,相对于ImageView的。
你也知道原始图像的尺寸。
现在,如果p1.x,例如,是50,在一个ImageView的是200像素宽,将得到的200分之50= 0.25关系
如果你的原始图像是100像素宽,你的观点p1.x将位于100 * 0.25 = 25 PX
可以表示为:
50 - > 200
? - > 100
和计算:
? = 100 *二百分之五十○
您的每一点做到这一点,每个维度X,Y,然后你得到4分矩形的原始形象。
现在,如果你重复使用这些计算点,你应该得到的矩形像素的原始形象。
在这里,我假设你放置了图像视图里面的东西。 难道这里面的onCreate:
ImageView image=(ImageView) findViewById(R.id.imageView1);
TextView coordinates=(TextView) findViewById(R.id.textView1);
bitmap = ((BitmapDrawable)Map.getDrawable()).getBitmap();
而这里面onTouch:
coordinates.setText("Touch coordinates:"+String.valueOf(event.getX())+"x"+String.valueOf(event.getY()));
int pixel = bitmap.getPixel((int)event.getX(), (int)event.getY());
现在,你有你想要的特定像素。