2011-09-27 15 views
0

基本上,我正在使用floodfill方法對位圖圖像的部分進行着色。這一部分很容易,但問題出現在我爲顏色填充例程添加效果的方式中。有沒有辦法找到已使用bitmapdata.floodfill方法填充的位圖區域的大小?

要添加效果,首先創建一個位圖數據的副本,並在其上使用floodfill而不是原始位圖。然後,使用bitmapdata.compare方法將除填充部分以外的所有內容的Alpha值設置爲0,並將結果保存在另一個位圖數據中。之後,一個1像素的半徑圓形精靈被添加到舞臺上,並且被補間到圖像尺寸,並且其掩碼被設置爲包含比較操作結果的精靈。

這個效果很好,除了填充精靈必須被補償到完整的圖像尺寸,而不管區域有多小,因爲我無法找到一種方法來獲得填充區域。我在補間結束時進行位圖圖像更新,並且必須禁用用戶交互,直到補間完成爲止,以避免在基礎圖像更新之前開始另一個補間操作時出現的錯誤。如果我能以某種方式獲得填充區域的尺寸,那麼我必須禁用用戶交互的時間將大大減少。

任何想法?

回答

0

getColorBoundsRect怎麼樣?我不知道你的填充顏色是否會出現在你的位圖的其他部分,但它可能會訣竅。

+0

完美!那就是訣竅。它最初困擾了我一下,因爲當它需要ARGB格式的掩碼和顏色值時,我一直試圖用RGB顏色值進行嘗試。一旦解決了,它就像魅力一樣。 :) – localhost

0

編寫您自己的填充例程。在填充像素時,存儲您需要的尺寸信息。最簡單的就是存儲邊界框。您可以通過查找相應顏色的相鄰像素進行填充,並且任何時候這種移動都會使您離開工作邊界框,然後進行調整。

更復雜的可以存儲位圖。任何你選擇的方式,重點是你可以通過不解決沒有設計的東西而更容易地得到你所需要的東西。

+0

我得到它與getColorBoundsRect一起工作,但我對你的建議感興趣。問題是你的方法需要我事先知道邊界框,這是我首先需要知道的。此外,內置的位圖數據操作方法比我可能提出的任何自定義方法都快很多,所以我不確定即使我能想出可行的方法,它也會通過性能測試。 – localhost

+0

這種方法的大問題當然是你現在正在掃描像素兩次。我的評論意見是,API不提供同一算法的兩種功能,因此任何不使用自己例程的方法都必須使用兩個像素掃描API,將性能降低2倍。如果這是可以接受的,那麼使用現有的代碼而不是調試和優化你自己的代碼當然是好的。 – ex0du5

+0

@localhost:在邊界框上,你不需要預先。您首先在開始的像素周圍使用一個像素大小的邊界框。隨着填充區域的增長,您將生長邊界框。至於你是否可以超越本地例程,這一切都取決於你的約束。有很多方法可以優化。在AS3內部,您可以從每個增長區域的GetPixels開始(根據需要添加rects)。如果數組訪問速度慢,abcsx可用於手動優化。 PixelBender着色器提供更快的遍歷。鍊金術可以測試更好的表現。 – ex0du5

0

我認爲getColorBoundsRect正是你所需要的。您選擇一種顏色並在位圖中獲取該顏色的邊界框。

+0

是的工作。感謝你和frankhermes的評論,我被拯救出來嘗試一些怪異的hackjobs只是爲了讓這個東西起作用。 :) – localhost

相關問題