2011-03-17 44 views
2

我有一個透明的BitmapData對象(sourceBitmapData參數)。每次我使用copyPixels()將它複製到另一個BitmapData對象時,透明像素會替換下面的任何對象。我希望copyPixels()函數簡單地忽略這些完全透明的像素(0x00),而不是複製它們。如何設置copyPixels忽略透明像素?

任何想法?

順便說一句,我試着將alphaMerge設置爲true,但是這並沒有解決問題 - 整個源對象只是變黑,而忽略了所有的透明度。

編輯:

這裏是代碼段;

var b:UIComponent = new UIComponent(); 
    b.graphics.beginFill(color, opacity); 
    b.graphics.drawCircle(size * 2, size * 2, size); 
    b.graphics.endFill(); 

    shape = new BitmapData(size * 4, size * 4, true, 0x00FFFFFF); 
    shape.draw(b); 
    rect = new Rectangle(0, 0, size * 4, size * 4); 
    shape.applyFilter(shape, rect, new Point(0, 0), new BlurFilter(20, 20)); 

它創建一個圖形對象(在這種情況下爲圓形)並將其複製到源位圖,然後應用模糊濾鏡。

drawBuffer.copyPixels(shape, rect, pnt, null, null, false); 

之後,它將結果圖像多次應用於drawBuffer。如果alphaMerge被設置爲true,形狀看起來就像一個黑色的blob - 似乎所有的alpha信息都被忽略,並且alpha值被設置爲0xFF(注意:這是基於它的外觀的推測,我沒有驗證它)。另一方面,如果alphaMerge設置爲false,則透明度將全部覆蓋,除了覆蓋它下面的任何內容(drawBuffer中的像素)爲透明像素。

以防萬一你需要drawBuffer以及代碼:

drawBuffer = new BitmapData(bitmapData.width, bitmapData.height, true, 0); 
drawCanvas.graphics.beginBitmapFill(drawBuffer, null, false, true); 
drawCanvas.graphics.drawRect(0, 0, drawBuffer.width, drawBuffer.height); 
drawCanvas.graphics.endFill(); 
+0

alphaMerge應該這樣做。你確定圖像是透明的32位嗎?你能向我們展示目標和源BMD的代碼嗎? – 2011-03-17 23:56:12

+0

如果您將源位圖數據的位圖繪製到目標位置,該怎麼辦?這將考慮到透明度。 – alxx 2011-03-18 09:40:12

+0

你的意思是BitmapData.draw()?對於我所需要的,它太慢了。 – Joe 2011-03-18 10:11:26

回答

1

我試着將你的代碼複製到一個空白的項目中。它適用於我的一些示例值。還有其他的錯誤。

複製到空白FLA這樣的:

var color:uint = 0xff0000; 
var opacity:Number = 0.8; 
var size:Number = 50; 

var b:Sprite = new Sprite(); 
b.graphics.beginFill(color, opacity); 
b.graphics.drawCircle(size * 2, size * 2, size); 
b.graphics.endFill(); 

// draw semitransparent object from "b" to shape 
var shape:BitmapData = new BitmapData(size * 4, size * 4, true, 0x00FFFFFF); 
shape.draw(b); 
var rect:Rectangle = new Rectangle(0, 0, size * 4, size * 4); 
shape.applyFilter(shape, rect, new Point(0, 0), new BlurFilter(20, 20)); 
var pnt:Point = new Point; 


// create drawBuffer with yellow (to indicate transparency) 
var drawBuffer:BitmapData; 
drawBuffer = new BitmapData(300, 300, true, 0xffffff00); 

// copy to drawBuffer (preserving transparency) 
drawBuffer.copyPixels(shape, rect, pnt, null, null, true); 

// using drawCanvas, put drawBuffer to screen 
var drawCanvas:Sprite = new Sprite; 
drawCanvas.graphics.beginBitmapFill(drawBuffer, null, false, true); 
drawCanvas.graphics.drawRect(0, 0, drawBuffer.width, drawBuffer.height); 
drawCanvas.graphics.endFill(); 
addChild(drawCanvas); 

(請注意我在true傳遞到copyPixels的mergeAlpha。)

+0

我已經使用過你的代碼,經過一些進一步的測試後,我發現問題畢竟不在copyPixels()參數中。相反,每幀應該運行copyPixels()約100次的特定循環正在完成其工作 - 通過在相同的地方(而不是在不同的地方)複製相同的形狀對象100次以上,這使得它看起來像沒有透明度。再次感謝您的幫助! – Joe 2011-03-18 16:46:33

1

你一定要mergeAlpha是真實的:

drawBuffer.copyPixels(shape, rect, pnt, null, null, true); 

,因爲這不是爲你工作,仔細檢查位圖的內容。你可以通過它直接添加到舞臺,保證您所看到的真正的內容做到這一點:

var b:Bitmap = new Bitmap(shape); 
stage.addChild(b); 

如果此位圖顯示正確的,也許你複製的位圖不止一次不清除目標。

還將UIComponent更改爲Sprite或類似。我不熟悉UIComponent,但您似乎沒有使用任何功能。

+0

我已經測試了形狀位圖,它確實看起來應該是這樣。然而,當我複製(經由copyPixels)至drawBuffer,它要麼: a)在alphaMerge設置爲false b會將通過普通那些透明的像素)忽略所有阿爾法數據,而是把整體形狀,如果它有最大阿爾法(0xFF) 也許我應該提到這一點 - 我在將模糊濾鏡添加到drawBuffer之前應用了模糊濾鏡(這就是我得到透明像素的方式)。 – Joe 2011-03-18 11:44:44

+0

我建議你在一個完全不同的項目中嘗試一個最簡單的情況。在我的經驗中,mergeAlpha從來不會忽略alpha數據。 – 2011-03-18 15:32:25

0

我可能會錯過一些明顯的東西,但copyPixel只是做它所說的 - 複製像素。它完全忽略了底下的內容,因此任何非100%透明像素(合併設置爲true)將被您的像素覆蓋。考慮到你有一個像素,0xFFFF00FF(紅色)如果你複製到一個像素0x4400FF00的結果將被覆蓋,而不是繪圖 - 0x4400FF00。

+0

只有在mergeAlpha爲false的情況下才爲true。我用'mergeAlpha'設置爲true的正常方式獲得了很多成功。 – 2011-03-18 15:29:33

0

在你嘗試之一,你有以下行:

drawBuffer =新的BitmapData(300,300,真實,0xffffff00);

嘗試改變顏色輸入的α值,如下所示:

drawBuffer =新的BitmapData(300,300,真實,0x00ffff00);

- 這是一個小小的改變,但它可能會讓你到你想去的地方。

-xprdq

+0

兩年前就已經有一個公認的答案。如果你正在尋找舊的,沒有答案的問題,請瀏覽這裏:http://stackoverflow.com/unanswered – valverij 2013-07-26 22:10:04