2011-06-20 89 views
1

我有一個問題。我有一個帶有2個紅色圓圈的BitmapData。我想找到矩形區域或每個圓圈。如果我使用[B] getColorBoundsRect [/ B],我得到2個圓圈包圍的最小區域。Actionscript 3:getColorBoundsRect

我該如何解決這個問題,並獲得個人圈子的區域?下面 是圖我創建更好地解釋我的問題:
http://img831.imageshack.us/img831/3360/sampleja.png

之前這個問題被問過,但不太瞭解 所提供的解決方案如何解決了這個問題。 http://www.kirupa.com/forum/showthread.php?324586-Question-to-getColorBoundsRect

希望有人在這裏可以爲我揭開一些光。太感謝了。

+0

這個問題建議從位圖數據中讀取像素並自己分析它們,但它沒有完成解決方案。如果你需要它快速工作,你可以閱讀不是每個像素,但每隔一秒鐘或三秒鐘。 – alxx

+0

有沒有更快的方法來做到這一點?也許在閃存中的函數構建? 因爲我需要在enterframe函數中運行這個腳本,所以每幀分析每個像素看起來很沉重 – Stii

+0

這實際上是圖像識別,它應該是像素沉重的。您可以掃描位圖跳過幾個像素,直到找到紅色,然後更精確地找到邊界。不要忘記鎖定和解鎖位圖數據,性能應該沒問題。 – alxx

回答

2

有一個非常巧妙的做法。首先,你需要確保你的BitmapData中只有兩種顏色(閾值會起作用)。之後,您可以使用getColorBounds和floodFill來查找圖像中的所有斑點。僞代碼是這樣的:

//Do the following until rect.width is zero. 
rect = bmp.getColorBoundsRect(red); 
//check the first row of pixels until you find the start of the blob 
for(y = rect.y; y < rect.height + rect.y; y++) { 
    if(bmp.getPixel(rect.x,y) == red) { 
    bmp.floodFill(rect.x,y, green); // paint the blob green 
    blobs.push(bmp.getColorBoundsRect(green)); // get the green bounds and push a new blob 
    bmp.floodFill(rect.x,y, white); // clear it 
    break; 
    } 
} 
+0

+1聰明,但可能太慢,有如此多的像素操作(雖然在快速本機代碼中有效)。 – alxx

+0

我已經使用了它幾次,並且運行速度足以在中等大小的BitmapData上執行幀。我很確定周圍有更快的算盤,但我喜歡它的簡單性:) – Cay

+0

@Cay getPixel和floodfill的x怎麼總是0?這不會導致它的第一列被檢查嗎? bmp.getColorBoundsRect(綠色)只指定掩碼顏色?對不起,我不是很擅長bitmapdata操作,因此需要更多的指針,像你們這樣的專業人士:)謝謝 – Stii