【问题标题】:Remove Whitepixels from a bitmap从位图中删除 Whitepixels
【发布时间】:2012-08-22 16:45:21
【问题描述】:

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

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

提前谢谢 =)

【问题讨论】:

    标签: actionscript-3 bitmap alpha-transparency


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

    • thx,这就是我的想法,但不知道如何编码,但你真的认为这是最快/最好的方式吗?
    • 我编辑了帖子。请检查。你已经检查了这个bmd.setPixel32(...)
    【解决方案2】:

    另一种方法是在创建 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);
            }
        }
    }
    

    【讨论】:

    • thanks man =) 我没有完全理解它,但它看起来很有效,接下来的几分钟会玩这个!感谢您的帮助!
    • 真的很简单(只有1行),我只是添加了一个愚蠢的例子。创建 BitmapData 时,给它一个透明填充而不是默认填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多