在位图图像中查找多边形

时间:2017-08-25 07:37:07

标签: android bitmap mesh

我在View中有一个Bitmap。 这是我绘制它的代码:

@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 个答案:

答案 0 :(得分:1)

我粗略的想法是去每个像素并检查颜色是否透明。 我们可以垂直遍历每条水平线。在任何水平线上,我们可以首先找到焦点图像的最左边界点,并在找到它时打破循环。现在在同一水平线上,我们可以找到焦点图像的最右边界点。您可以将所有这些边界像素(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;
    }
}
}

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

您可以使用以下内容来获取任何像素的颜色。来源 - here

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