2017-08-25 52 views
1

我在视图内有一个位图。 这里是我的绘制它的代码:查找位图图像中的多边形

@Override protected void onDraw(Canvas canvas) { 
     canvas.drawColor(0xFFCCCCCC); 

     int w = mBitmap.getWidth(); 
     int h = mBitmap.getHeight(); 
     float[] mVerts = { 
       0, 0, 
       w * 0.8f, 0, 
       0, h, 
       w, h * 0.7f 
     }; 
     canvas.drawBitmapMesh(mBitmap, 1, 1, mVerts, 0, null, 0, null); 

} 

,它看起来像这样:

enter image description here

现在的问题是:

如果我有一些形状和透明的形象背景如何找到一个覆盖该区域的多边形,如下所示:

enter image description here

然后我应该如何将所有这些点添加到位图网格,以便我可以让用户移动它们并像第一个示例中那样操作图像?

回答

1

我的主要想法是去每个像素,并检查颜色是否透明。 我们可以垂直移动到每条水平线。在任何水平线上,我们可以先找到最左边的焦点图像边界点,并在找到它时打破循环。现在在相同的水平线上,我们可以找到焦点图像的最右边界点。您可以将所有这些边界像素(x,y)坐标添加到您的ArrayListmVerts中。

事情是这样的 -

for(int i=0;i<bitmap.getHeigth();i++){ 
for(int j=0;j<bitmap.getWidth();j++){ 
    int pixel = bitmap.getPixel(i,j); 
    if(pixel != Color.TRANSPARENT){ 
     mVerts.add(i); 
     mVerts.add(j); 
     break; 
    } 
} 

for(int j=bitmap.getWidth()-1; j>=0 ;j--){ 
    int pixel = bitmap.getPixel(i,j); 
    if(pixel != Color.TRANSPARENT){ 
     mVerts.add(i); 
     mVerts.add(j); 
     break; 
    } 
} 
} 

您可以将此ArrayList mVerts传递给你的canvas.drawBitmapMesh()方法提取的焦点图像。

您可以使用以下方式获取任意像素的颜色。来源 - here

int colorCode = imageView.getDrawingCache().getPixel(x, y); 
+0

但是,它会给我几千点吗?在上面的图片中,你只有几个。而且它可能更少,因为吨的点数会影响性能。 – Makalele

+0

@Makalele是的,我同意。您可以增加循环增量,但它可能并不总是给你最好的结果。你需要的是一些图形算法,可以检测到所有尖锐的边界点。您可以使用该算法和上面已经解释的逻辑,即检查像素的颜色是否透明。感谢:) –

+0

也为了性能,你可以使用一些位图优化。由于我们不需要高质量的图像来生成mVerts数组,因此您可以使用图像的低质量等效图像,它将为您提供所有坐标。然后,您可以找到高质量图像的新像素。我希望这个答案能给你一点启动。 –