0

我将具有大量未使用空间的影片剪辑转换为位图,但似乎在转换过程中已将许多白色像素添加到位图中,因此无法正确显示背景。

我的问题是如何以最聪明的方式去除背景......去除每一个白色像素,如果是这样怎么做?如果可能的话,如何从影片剪辑生成一个 alphamap?还是我不知道的其他方式?

提前谢谢 =)

4

2 回答 2

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;
}
于 2012-08-22T17:01:51.283 回答
1

另一种方法是在创建 BitmapData 对象时,使用 alpha 为 0 的 ARGB 颜色填充。这样您就不必遍历 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);
        }
    }
}
于 2012-08-22T17:04:30.530 回答