2017-08-25 3 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; 
    } 
} 
} 

あなたがフォーカス画像を抽出するために、あなたのcanvas.drawBitmapMesh()方法にこのArrayListのmVertsを渡すことができます。

次のように使用して、任意のピクセルの色を取得できます。このため、ソース - here

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

しかし、それは私のポイントの数千人を与えることはありませんか?上の画像には、それらのうちのいくつかしかありません。また、ポイントの数がパフォーマンスに影響するため、さらに少なくなる可能性があります。 – Makalele

+0

@Makaleleはい私は同意します。ループのインクリメント量を増やすことはできますが、常に最適な結果をもたらすとは限りません。必要なのは、すべての鮮明な境界点を検出できるグラフィックスアルゴリズムです。あなたは、上記で説明したロジック、つまりピクセルの色をチェックするのが透明かどうかで、そのアルゴリズムを使用することができます。ありがとう:) –

+0

また、パフォーマンスのために、いくつかのビットマップ最適化を使用することができます。 mVerts配列を生成するために高品質の画像は必要ないので、すべての座標を与える低品質の画像を使用することができます。次に、高品質の画像の新しいピクセルを見つけることができます。私はこの答えがあなたにポイントを与えることを願っています。 –

関連する問題