2011-03-25 96 views
1

我想根據較小圖像的構成將圖像定位在另一圖像上。較小的圖像是較大圖像的切出部分,我需要將其精確定位在較大的圖像上,以使其看起來像單個圖像,但允許應用單獨的濾鏡和alpha。由於圖像不是簡單的矩形或圓形,而是複雜的衛星圖像,我不能簡單地用代碼重新繪製它們。我有相當多的圖像,因此不想手動找到每個圖像的位置,並在動作中手動設置它們。如果找到完美匹配,我有什麼辦法可以在較大的圖像上採樣一個5-10平方的小像素區域,並設置較小圖像的x值和y值?所有圖像都在一個數組中,並且已經設置了它們,我只需要一種方法來對像素進行採樣和匹配。我的第一個猜測是將圖像逐像素地向右和向下循環,覆蓋整個位圖並在找到匹配時移動到數組中的下一個孩子,將匹配的孩子留在發現完美匹配時的位置。比較兩個相互匹配的位圖匹配as3

+0

爲什麼不發佈至少僞代碼爲你正在做什麼,並告訴我們什麼不按預期工作。 – jswolf19 2011-03-25 02:22:11

回答

1

我希望我能正確理解你的問題。

可能有一個選項使用copypixels來實現你想要的。您可以使用bitmapdata.rect值來確定所需示例的大小,並使用矩形和移動點循環更大的位圖。讓我們看看我是否可以編碼...

function findBitmapInBitmap(tinyimg:BitmapData, largeimg:BitmapData):Point { 
    var rect:Rectangle = tinyimg.rect; 
    var xbound:uint = largeimg.rect.width; 
    var ybound:uint = largeimg.rect.height; 
    var imgtest:BitmapData = new BitmapData(tinyimg.rect.width, tinyimg.rect.height); 

    for (var ypos:uint = 0, y <= ybound, y++) { 
     for (var xpos:uint = 0, x <= xbound, x++) { 
      imgtest.copyPixels(largeimg, rect, new Point(xpos, ypos); 
      if (imgtest.compare(tinyimg) == 0) return new Point(xpos, ypos); 
     } 
    } 

    return new Point(-1,-1); // Dummy value, indicating no match. 

} 

沿着這些線應該工作 - 我敢肯定,代碼優雅和可能的優化的空間。但是,看起來像這種方法會很慢,因爲您必須檢查每個像素是否匹配。

有一個更好的方法。將您的大圖分割成圖層,並使用blitting技術在運行時將它們合成。在你的情況下,你可以創建一個沒有衛星的地面紋理,然後分別創建衛星,並使用copyPixels方法將它們放在任何你想要的地方。谷歌「在as3中傳輸」找到一些很好的教程。我目前正在研究使用這種技術的遊戲項目,這是一個非常好的方法。

祝你好運!

編輯:忘記在默認返回語句中的代碼。使用這種方法,你必須返回一個無效點(如(-1,-1)),並在函數外檢查它。或者,你可以將你的小位圖複製到函數中的大位圖,這會更合理,但我不知道你的要求。

+0

在您回答之前,我剛剛完成了一些與此類似的事情。我進一步嘗試確保它的採樣點不是較小位圖中的空像素,因爲它們通常是不帶拐角的不規則形狀。謝謝一堆。 – NickCSE 2011-03-26 17:18:21

+0

@ Shammr0ck嗯,你正在使用每像素的方法。如果你必須走這條路線,如果你的圖像支持透明度,你可以只檢查像素的第一個字節 - 如果第一個字節是0x00,則跳過檢查。這樣,你只會對顏色檢查顏色。不過,我仍然認爲,對於你似乎在做的事情,真正的blitting會是更好的答案,因爲你可以在幕後進行顏色更改,並放置圖像而不必擔心偏移和重疊。也許你可以詳細說明你的項目?聽起來很有趣。 – 2011-03-26 19:17:52

+0

還沒有機會看blitting,所以我現在就把它留在它的位置。我正在爲不同的公司創建交互式地圖,並且不希望在主要主圖像的頂部加載外部圖像時手動設置圖像位置。我並沒有完全爲我的需求制定出完美的解決方案,因爲圖像是從主地圖中剪切出來的,圖像編輯器嘗試對它們進行反鋸齒,然後邊緣無法匹配原始圖像中的任何內容。我打算使用黑名單數組來防止檢查者匹配那個位置,如果找不到匹配的話。 – NickCSE 2011-03-26 20:01:22

1

對於實際比較,有BitmapData.compare,如果BitmapData對象是等效的,則返回數字0。

+0

您仍然必須循環檢查像素數據,以檢查像素顏色是否不同於0. – 3Devil 2011-03-25 17:17:26

+0

@ 3Devil不能,請閱讀文檔。它返回數字0. – 2011-03-25 18:06:49

+0

我並沒有比較兩個位圖,而是試圖在另一個較大的位圖中找到一個較小的位圖。比較沒有爲我完成。 – NickCSE 2011-03-25 18:38:53

1

您需要在大圖像中找到像素序列。 BitmapData.getPixel爲您提供像素值。因此,從小圖像中獲取第一個像素,找到大圖像,然後繼續比較,直到找到完全匹配。如果您在編碼時遇到麻煩,請隨時詢問。

+0

這就是我的想法,但我不確定如何使它正常工作。我發佈了下面的內容。 – NickCSE 2011-03-25 15:35:13