Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在位图图像中查找多边形_Android_Bitmap_Mesh - Fatal编程技术网

Android 在位图图像中查找多边形

Android 在位图图像中查找多边形,android,bitmap,mesh,Android,Bitmap,Mesh,我在视图中有一个位图。 以下是我绘制它的代码: @Override protected void onDraw(Canvas canvas) { canvas.drawColor(0xFFCCCCCC); int w = mBitmap.getWidth(); int h = mBitmap.getHeight(); float[] mVerts = { 0, 0,

我在视图中有一个位图。 以下是我绘制它的代码:

@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);

}
看起来是这样的:

现在的问题是:

如果我有一个具有某种形状和透明背景的图像,如何找到覆盖该区域的多边形,其外观如下:


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

我的大致想法是查看每个像素,检查颜色是否透明。 我们可以垂直穿过每一条水平线。在任何水平线上,我们都可以首先找到焦点图像最左边的边界点,当我们找到它时,就打破了循环。现在在同一条水平线上,我们可以找到聚焦图像最右边的边界点。您可以将所有这些边界像素(x,y)坐标添加到
ArrayList
mVerts

类似这样的事情-

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;
    }
}
}

但它不会给我几千分吗?在上面的图片上,您只有几个。而且可能会更少,因为大量分数会影响性能。@Makalele是的,我同意。您可以增加循环增量量,但它可能不会始终提供最佳结果。您需要的是一些能够检测所有尖锐边界点的图形算法。您可以将该算法与我上面解释的逻辑结合使用,即检查像素的颜色是否透明。谢谢:)另外,为了提高性能,您可以使用一些位图优化。因为我们不需要高质量的图像来生成mVerts数组,所以您可以使用图像的低质量等价物,它将为您提供所有坐标。然后,您可以为高质量图像找到新像素。我希望这个答案能给你一个起点。
int colorCode = imageView.getDrawingCache().getPixel(x, y);