2011-03-24 57 views
0

我已經填充了位圖資源的位圖數據的圓形狀。ActionScript - getPixel()使用變換矩陣在BitmapData上創建座標?

我需要從中心旋轉圓,所以我將位圖添加到圓的中心,並使用矩陣變換將位圖數據向上和向左移動,使其看起來居中。

現在我試圖讀getPixel()的位圖數據,但返回值是關閉的,因爲它返回位圖數據的未轉換位置而不是可見的轉換位圖數據。

Bitmap(Sprite(evt.currentTarget).getChildAt(0)).bitmapData.getPixel(evt.localX, evt.localY) 

我怎樣才能得到一個準確的讀取像素數據從位圖矩陣轉換?


更新了代碼。假設我的例子中的redCircleData更豐富多彩,值得檢索像素數據。

var redCircleData:Sprite = new Sprite(); 
redCircleData.graphics.beginFill(0xFF0000, 1.0); 
redCircleData.graphics.drawCircle(0, 0, 100); 
redCircleData.graphics.endFill(); 

var matrix:Matrix = new Matrix(); 
matrix.tx = redCircleData.width/2; 
matrix.ty = redCircleData.height/2; 

var myBitmapData:BitmapData = new BitmapData(redCircleData.width, redCircleData.height, true, 0x00FFFFFF); 
myBitmapData.draw(redCircleData, matrix); 

var theBitmap:Bitmap = new Bitmap(myBitmapData, PixelSnapping.AUTO, true); 
theBitmap.x -= matrix.tx; 
theBitmap.y -= matrix.ty; 

addChild(theBitmap); 

回答

1

Matrix類爲您提供了一些非常方便的功能來處理你的問題:

Matrix.invert();

Matrix.transformPoint();

獲取矩陣的逆矩陣(反轉它的一個副本),然後用它轉換Point(e.localX,e.localY)。使用變形點座標作爲getPixel()的參數。 BitmapData只是內存中的RGB或RGBA像素塊,其中(0,0)是左上角。您需要向後查看您使用的變換來顯示它以查找鼠標下位圖的像素。這就是倒置矩陣爲你所做的。

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/geom/Matrix.html

+0

我需要將我的大腦圍繞Matrix矩陣更好一些 - 幾個月前我不得不做很類似的事情,而當矩陣轉換工作時,我不知道如何以有意義的方式找到(0,0)。我最終做的是創建一個包裝器,將轉換後的圖像添加到包裝器中,然後繪製包裝器 - 這顯然會比較慢。 – Myk 2011-03-25 00:08:12

+0

重要的是要記住(對於我來說),矩陣乘法是不可交換的(AB不同於BA),所以當你有多個變換矩陣順序地應用到某個東西時,必須撤消逆向順序,您可以將它們應用到您開始的位置,或者(等同地)按順序將它們按順序相乘,然後再進行反轉。 – 2011-03-25 00:13:53

+0

閱讀文檔後,我不確定這是否適用於我的情況。 incase我不太關注你,一些示例代碼將不勝感激。 – TheDarkIn1978 2011-03-25 10:42:21

0

我不知道,如果你想要做什麼是可能的(我從來沒有嘗試過,至少,我認爲你不能真正應用轉型的印象很一個BitmapData對象,但我可能是錯的)。但是,您可以創建一個新的BitmapData,其中包含您感興趣的區域的快照並讀取來自此新對象的像素。這樣你可以輕鬆實現你想要的。

+0

這是不幸的是,它似乎並不可能能夠分配一個報名點BitmapData對象。如果這是可能的,那將會更容易。我用更多的代碼更新了我的問題,顯示了模擬中心註冊位圖和位圖數據的過程。它也違反直覺,雖然bitmapdata被傳遞給位圖,但座標是靜態的,因爲如果位圖移動,座標不會與位圖一起移動 - 這是當前的問題。 – TheDarkIn1978 2011-03-24 21:03:42