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