2017-08-25 78 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數組,因此您可以使用圖像的低質量等效圖像,它將爲您提供所有座標。然後,您可以找到高質量圖像的新像素。我希望這個答案能給你一點啓動。 –