flash - AS3 如何检查 BitmapData 是否为空

标签 flash actionscript-3 bitmapdata erase

我有一个代码可以删除蒙版的影片剪辑。 (学分here) 我想知道如何检查整个影片剪辑是否已被删除。 所以我想我必须检查 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);
    }

最佳答案

您可以检查 getColorBoundsRect为您认为“空”的颜色返回一个宽度和高度为 0 的矩形,将 findColor 参数设置为 false。还有其他方法可以做到这一点,但这至少比检查每个像素快很多倍。

findColor 参数的默认值 true 为您提供了一个矩形,其中包含那些 (pixelColor & mask) == emptyColor 为 true 的所有像素。在处理 alpha 值时,可以使用掩码 0xFF000000 忽略像素的 rbg 值并仅检查其 alpha 值。所以掩码 0xFF000000 和颜色 0xFF000000 将匹配所有完全不透明的像素,而掩码 0xFF000000 和颜色 0x00000000 将匹配所有完全透明的像素。如meddlingwithfire指出,这在这里不起作用。通过将 findColor 设置为 false,此过程有点相反,因此矩形将使用空颜色包围所有 not 的像素。对于不包含其他颜色的位图,结果将是一个面积为 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 值,就像我在示例中使用该特定掩码所做的那样。

关于flash - AS3 如何检查 BitmapData 是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282484/

相关文章:

flash - Actionscript-3 命名空间和动态类型?

flash - Flash加载外部文件会卡住页面-或-多个同时下载

actionscript-3 - 检测用户的相机设置

android - Android 版 Adob​​e AIR (Flex 4.6.0) 中前置摄像头、视频和视频显示的显示错误

c++ - 在 C++ 中使用 BitmapData 的 AccessVioilationException

actionscript-3 - AS3 bitmapdata.draw 无需添加到显示列表/舞台

Android Renderscript Allocation.USAGE_SHARED 崩溃

flash - 生成大量位图时,创建的位图会变成全黑

php - MySQL、PHP 和 AS3 - 根据 ID 显示内容

html - IE 8 中的溢出隐藏和 Flash 内容