2012-08-22 89 views
0

我将大量未使用空间的动画片段转换为位图,但似乎很多白色像素在转换过程中已添加到位图中,因此背景将不会正确显示。从位图中移除白色像素

我的问题是如何去除背景的最聪明的方法... 删除每一个白色像素,如果是的话如何做到这一点?如果可能的话, 从动画片段生成一个alphamap如何? 或其他我不知道的方式?

thx预先=)

回答

2

参考下面的代码。此代码是如果像素为白色,则转换为透明色。

for(var i:int = 0; i<myBitmapData.width; i++) 
{ 
    for(var j:int = 0; j<myBitmapData.height; j++) 
    { 
     if(myBitmapData.getPixel(i,j) == 0xffffff) 
     { 
      var transparent:uint = 0x00000000; 
      myBitmapData.setPixel32(i, j, transparent); 
     } 
    } 
} 

您已经检查了以下代码。在测试之前,必须将颜色更改为红色或蓝色或绿色......您需要。

import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.BitmapData; 
import flash.display.Bitmap; 
import flash.events.MouseEvent; 

var brush:Sprite =new Sprite(); 
brush.graphics.beginFill(0xffffff); 
brush.graphics.drawRect(0,0,100,100); 
brush.graphics.endFill(); 
//addChild(brush); 

var myBitmap:Bitmap = new Bitmap(convertToBitmap(brush)); 
var bmd:BitmapData = myBitmap.bitmapData; 
addChild(myBitmap); 

for(var i:int = 0; i<bmd.width; i++) 
{ 
    for(var j:int = 0; j<bmd.height; j++) 
    { 
     if(bmd.getPixel(i,j) == 0xffffff) 
     { 
      var transparent_color:uint = 0x00000000; 
      bmd.setPixel32(i, j, transparent_color); 
     } 
    } 
} 

function convertToBitmap(clip:DisplayObject):BitmapData 
{ 
    var bounds:Rectangle = clip.getBounds(clip); 
    var bitmap:BitmapData = new BitmapData(int(bounds.width + 0.5), int(bounds.height + 0.5), true, 0); 
    bitmap.draw(clip, new Matrix(1,0,0,1,-bounds.x,-bounds.y)); 
    return bitmap; 
} 
+0

THX,这就是我想过,但不知道如何编码,但你真的认为这是最快/最好的方法是什么? – tschery

+0

我编辑后。请检查。你已经检查过这个'bmd.setPixel32(...)'。 –

1

另一种方式是创建BitmapData对象时,与一个ARGB颜色谁的alpha为0。这样,您就不必遍历的BitmapData并设置每个像素为@的BitmapData的答案中使用填充。

var bitmapData:BitmapData = new BitmapData(100, 100, true, 0x00000000); 

下面是一个示例应用程序,这显示在效果:

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Graphics; 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 

    public class TestAS3 extends Sprite 
    { 
     private var drawingObject:Sprite = new Sprite(); 
     private var bitmap:Bitmap = new Bitmap(); 
     private var backgroundObject:Sprite = new Sprite(); 

     public function TestAS3() 
     { 
      super(); 
      stage.scaleMode=StageScaleMode.NO_SCALE; 
      stage.align=StageAlign.TOP_LEFT; 

      // draw something on the background, so we can verify the 
      // bitmap has transparency 
      var g:Graphics = backgroundObject.graphics; 
      g.beginFill(0xFF0000); 
      g.drawRect(0,0,200,200); 
      g.endFill(); 
      addChild(backgroundObject); 

      // draw a black circle so we can make a bitmap out of it 
      g = drawingObject.graphics; 
      g.beginFill(0); 
      g.drawCircle(100,100,50); 
      g.endFill(); 

      // create the bitmap data 
      // note use an ARGB color (here color is black, alpha is 0) 
      // to default the BitmapData to a transparent fill 
      var bmd:BitmapData = new BitmapData(200,200,true,0x00000000); 
      bmd.draw(drawingObject); 
      bitmap.bitmapData=bmd; 
      addChild(bitmap); 
     } 
    } 
} 
+0

谢谢man =) 我完全不理解它,但它看起来很像它的工作原理,会在接下来的几分钟里玩!感谢您的帮助! – tschery

+1

这真的很简单(只有1行),我只是添加了一个愚蠢的例子。创建BitmapData时,给它一个透明的填充,而不是默认的填充。 –