3

マスクされたムービークリップを消去するコードがあります。(クレジットはこちら) ムービークリップ全体が消去されたかどうかを確認する方法を知りたいです。そのため、BitmapData が空かどうかを確認する必要があると考えましたが、ひどく間違っている可能性があります。ムービークリップのすべてのピクセルが消去されたかどうかを確認するにはどうすればよいですか?
もちろん、以下の私の例は間違っていますが、そのようなものでなければならないと思います。

if (erasableBitmapData = empty)
    { 
    trace("empty")
    }

    var lineSize:Number=40;
    var doDraw:Boolean=false;
    var resumeDrawing:Boolean=false;

    var erasableBitmapData:BitmapData = new BitmapData(700, 500, true, 0xFFFFFFFF);
    var erasableBitmap:Bitmap = new Bitmap(erasableBitmapData);
    erasableBitmap.cacheAsBitmap = true;
    addChild(erasableBitmap);

    maskee.cacheAsBitmap = true;
    maskee.mask = erasableBitmap;

    var eraserClip:Sprite = new Sprite();
    initEraser();
    function initEraser():void {
        eraserClip.graphics.lineStyle(lineSize,0xff0000);
        eraserClip.graphics.moveTo(stage.mouseX,stage.mouseY);
    }

    var drawnBitmapData:BitmapData = new BitmapData(700, 500, true, 0x00000000);
    var drawnBitmap:Bitmap = new Bitmap(drawnBitmapData);

    stage.addEventListener(MouseEvent.MOUSE_MOVE,maskMove);
    stage.addEventListener(MouseEvent.ROLL_OUT, maskOut); 
    stage.addEventListener(MouseEvent.ROLL_OVER,maskOver);
    stage.addEventListener(MouseEvent.MOUSE_DOWN,startDrawing);
    stage.addEventListener(MouseEvent.MOUSE_UP,stopDrawing);

    function startDrawing(e:MouseEvent):void {
        eraserClip.graphics.moveTo(stage.mouseX,stage.mouseY);
        doDraw=true;
    }

    function stopDrawing(e:MouseEvent):void {
        doDraw=false;
        resumeDrawing = false;
    }

    function maskOut(e:Event):void {
        if (doDraw){
            resumeDrawing = true;
        }
    }

    function maskOver(e:MouseEvent):void {
        if (resumeDrawing){
            resumeDrawing = false;
            eraserClip.graphics.moveTo(stage.mouseX,stage.mouseY);
        }
    }

    function maskMove(e:MouseEvent):void {
        if (doDraw && !resumeDrawing){
            eraserClip.graphics.lineTo(stage.mouseX,stage.mouseY);
            drawnBitmapData.fillRect(drawnBitmapData.rect, 0x00000000); 
            drawnBitmapData.draw(eraserClip , new Matrix(), null, BlendMode.NORMAL);
            erasableBitmapData.fillRect(erasableBitmapData.rect, 0xFFFFFFFF);
            erasableBitmapData.draw(drawnBitmap, new Matrix(), null, BlendMode.ERASE);
        }
            e.updateAfterEvent();
    }


    reset_btn.addEventListener(MouseEvent.CLICK,reset);

    function reset(e:Event):void {
        eraserClip.graphics.clear();
        initEraser();
        erasableBitmapData.fillRect(erasableBitmapData.rect, 0xFFFFFFFF);
    }
4

3 に答える 3

6

引数をfalseに設定して、「空」と見なす色getColorBoundsRectの幅と高さの長方形を返すかどうかを確認できます。これを行う方法は他にもありますが、これはすべてのピクセルをチェックするよりも少なくとも何倍も高速です。0findColor

引数のデフォルト値 true は、true のfindColorすべてのピクセルを囲む四角形を提供します(pixelColor & mask) == emptyColor。アルファ値を扱う場合、 のマスクを0xFF000000使用して、ピクセルの rbg 値を無視し、そのアルファ値のみをチェックできます。したがって、マスク0xFF000000と色0xFF000000は完全に不透明なすべてのピクセルに一致し、マスク0xFF000000と色0x00000000は完全に透明なすべてのピクセルに一致します。meddlingwithfireが指摘したように、これはここでは機能しませんfalse に設定findColorすると、このプロセスが逆になり、空の色を使用していないすべてのピクセルが四角形で囲まれます。他の色を含まないビットマップの場合、結果は の面積を持つ長方形になります0

var maskColor:uint = 0xFF000000;
var emptyColor:uint = 0x00000000;
var bounds:Rectangle = erasableBitmapData.getColorBoundsRect(maskColor, emptyColor, false);
if (bounds.width == 0 && bounds.height == 0){
    trace("empty"); // no visible pixels
}

技術的には、黒い透明ピクセル0x00000000とたとえば赤い透明ピクセル0x00FF0000には違いがありますが、目に見える違いはありません (どちらも見えない) ので、例でその特定のマスクを使用して行ったように、RGB 値を完全に無視する必要があります。

于 2011-09-02T13:04:07.980 に答える
1

ベースラインの「空の」BitmapDataインスタンスを作成します。そのBitmapDataのcompareメソッドを使用して、「潜在的に空の」BitmapDataを渡します。2つのピクセルの違いを含む新しいBitmapDataリファレンスを取得します。その新しいBitmapData参照を使用して、ヒストグラムメソッドにアクセスし、すべてのチャネルのすべてのカウントのリストを取得できます。空のBitmapDataインスタンスと「潜在的に空の」BitmapDataインスタンスがまったく同じである場合、ヒストグラムチャネルには、各チャネルのゼロインデックスのカウントとしてBitmapDataのピクセルの総数が含まれます(この場合のBitmapDataの違いのため)等しいデータの0x00000000ピクセルで埋められます)。

高価なgetPixel()メソッドを手動で呼び出すのではなく、ASエンジンを使用して各ピクセルを確認できるため、比較的高速である必要があります。

カラーバウンドアプローチを使用すると、誤検知が発生する可能性があります。ビットマップが左上と左下の位置で同じである場合、その間のすべてのピクセルが完全に異なる可能性があるとしても、長方形の色の境界は領域全体を包含します。

于 2011-09-02T18:22:59.843 に答える
1

この関数は、呼び出した 2 つの の差を含むBitmapData.compare(BitmapData)new を返すか、オブジェクトが等しい (幅、高さ、およびピクセル値が同じ) 場合、メソッドは数値 0 を返します。にグラフィックスが含まれているかどうかを確認しますBitmapDataBitmapDataBitmapDataDisplayObject

var eraseableBitmapData:BitmapData = new BitmapData(264,864,true,0xFFFFFFFF);
//initialise the eraseableBitmapData
eraseableBitmapData.draw(someDisplayOject)
//draw your object's bitmap data

var emptyBitmapData:BitmapData = new BitmapData(264,864,true,0xFFFFFFFF);
//create an identical but empty BitmapData object

if( erasableBitmapData.compare ( emptyBitmapData ) == 0 ) {
    trace("empty");//object is completely empty
} else {
    trace("not empty");//object still has stuff in
}

draw() ドキュメント

compare() ドキュメント

于 2013-04-21T12:19:12.220 に答える