0

未使用のスペースが多いムービークリップをビットマップに変換しましたが、変換中に多くの白いピクセルがビットマップに追加されたため、背景が正しく表示されないようです。

私の質問は、背景を最も賢い方法で削除する方法です...すべての白いピクセルを削除します。もしそうなら、それを行う方法は?可能であれば、ムービークリップからアルファマップを生成する方法は?または私が知らない他の方法?

事前にt​​hx=)

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

もう1つの方法は、BitmapDataオブジェクトを作成するときに、アルファが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 に答える