我有一个代码可以删除蒙版的影片剪辑。 (学分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/