2010-02-17 107 views
2

是否可以檢測(動態)圖像的白色像素並刪除它們?其實我有一些圖像,我加載在舞臺上,但他們是正方形,沒有實際圖像是方形大小。所以我想讓打擊區域完全是圖像的形狀,而不是他們擁有的白色邊框。檢測並擦除圖像中的特定像素

PS:在ActionScript :)

回答

0

你可以通過位圖數據循環,檢查每個像素,看看它的顏色白色邊框相匹配,但如果有圖像中的其它白色像素可能會遇到麻煩,除非你只能檢查圖像上的某些位置,而且這聽起來很亂。

編輯: 從我所瞭解的情況來看,您的圖像具有沿着外部的白色邊框,並且您不希望邊框成爲hitarea的一部分。我建議你編輯圖像(在photoshop外部)並刪除白色邊框。

然後改爲使用ActionScript將這些白色邊框重新創建爲獨立圖像。檢查實際圖像的大小並不難,然後創建一個大一點的精靈並用白色填充它。然後將實際圖像置於其上並居中。所以現在看起來像圖像有一個邊框。您可以將白色填充圖像和實際圖像放在容器中,以方便將它們作爲一個整體移動。您還可以輕鬆將圖像設置爲目標區域而不是邊界。

+0

對不起,艾倫你能否重申這個問題,我無法弄清楚你的建議。 – Ponty

+0

更新了我的答案,希望它更清楚一點。 – Allan

1

您可以通過循環遍歷像素,每次從左上角開始,從右下角開始,直到找到非白色像素爲止。有點像這樣...

首先使用getPixel

var j:Number = 0; 
var i:Number = 0; 
var tl_corner:Point; // top left corner 
var br_corner:Point; // bottom right corner 

for (j = 0; j < imageBitmapData.height; j++) { 
    for (i = 0; i < imageBitmapData.width; i++) { 
     if (imageBitmapData.getPixel(i, j) != 0xFFFFFF) { 
      tl_corner = new Point(i, j) 
     } 
    } 
} 


for (j = imageBitmapData.height - 1; j >= 0; j--) { 
    for (i = imageBitmapData.width - 1; i >= 0; i--) { 
     if (imageBitmapData.getPixel(i, j) != 0xFFFFFF) { 
      br_corner = new Point(i, j) 
     } 
    } 
} 

現在你有實際圖像的左上角和右下角,沒有白色。

現在使用copyPixels

var bmd:BitmapData = new BitmapData(br_corner.x - tl_corner.x, br_corner.y - tl_corner.y, false, 0x00000000); 
bmd.copyPixels(imageBitmapData, new Rectangle(tl_corner.x, tl_corner.y, (br_corner.x - tl_corder.y), (br_corner.y - tl_corner.y)), new Point(0, 0)); 

現在你有一個BitmapData對象,只有你想要的像素。也許:

var s:Sprite = new Sprite(); 
var bmp:Bitmap = new Bitmap(bmd); 
s.addChild(bmp); 
+0

此解決方案不適用於區域內非正方形的圖像,例如,如果您使用白色圓圈作爲示例,則左上角的點將被選爲圓的頂部中間,底部右點將被選爲圓的底部中間。在圓的中間產生一個零或一個像素切片,而不是整個圓。 – Geoff