按位运算Flex / AS3中的位图

时间:2009-09-21 15:31:24

标签: flex actionscript-3

我希望在Flex / AS3中实现三个位图上的特定按位逻辑运算。它可能必须使用DisplayObject混合模式,ColorMatrix滤镜的某些组合,以及可能还有其他我没有想到的东西,因为FLex / As3在像素上没有按位逻辑运算(BlendMode.INVERT除外)。 / p>

所以这是操作:

(B& S)| (F& ~S)

[其中B,S,F是三个位图]

就是这样。

顺便说一下,我用Pixel Bender试过这个,但令人难以置信的是,它也没有按位逻辑操作。 (你到底在想什么Adobe)。所以我模拟它们没有大约50模数和分歧但它出来的方式太慢了。 (可能是因为我没有支持的图形卡,这会带来另一个问题 - 如果Pixel Bender仅适用于某些卡,如果浏览器计算机有支持的卡,如何在运行时从Flex / AS3中找到它。)< / p>

但无论如何,我的主要问题是如何在Flex / AS3中执行上面那个微不足道的小位操作。 (它必须和BlendModes一样快。)

2 个答案:

答案 0 :(得分:1)

我在使用按位操作方面不是很有经验,但我使用花哨的新Flash播放器10向量组合了一个快速测试用例,这对于这种类型的数据争用非常好。

使用我的计算机上的独立调试播放器,它在115ms内运行2000x2000像素,在发布播放器中可能会快一点。

我不确定这是否足够快,因为我不知道你需要多长时间或多大的图像来运行它,但它至少可能是一个起点。

package  {
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.geom.Rectangle;
    import flash.text.TextField;
    import flash.utils.getTimer;
    /**
     * ...
     * @author Martin Jonasson
     */
    public class Test extends Sprite {

        public function Test() {

            var output:TextField = new TextField();
            output.autoSize = "left";
            addChild(output);

            var bmpB:BitmapData = new BitmapData(2000, 2000, false, 0xff00ff);
            var bmpS:BitmapData = new BitmapData(2000, 2000, false, 0xffffff);
            var bmpF:BitmapData = new BitmapData(2000, 2000, false, 0x000000);

            var rect:Rectangle = new Rectangle(0, 0, 2000, 2000)

            var vecB:Vector.<uint> = bmpB.getVector(rect);
            var vecS:Vector.<uint> = bmpS.getVector(rect);
            var vecF:Vector.<uint> = bmpF.getVector(rect);

            var vecFinal:Vector.<uint> = new Vector.<uint>(vecB.length, true);

            var startTime:int = getTimer();
            for (var i:int = vecB.length - 1; i >= 0; --i) {
                vecFinal[i] = (vecB[i] & vecS[i]) | (vecF[i] & ~vecS[i]);
            }
            output.appendText("bitwise stuff done, took: " + (getTimer() - startTime) + "ms \n");

            startTime = getTimer();
            var bmpFinal:BitmapData = new BitmapData(2000, 2000, false);
            bmpFinal.setVector(rect, vecFinal);
            output.appendText("created bitmapdata, took: " + (getTimer() - startTime) + "ms \n");

        }

    }

}

答案 1 :(得分:0)

至grapefrukt:

1000X1000位图在我的系统上是47毫秒,所以这看起来很有希望(接近标准刷新率,并希望有一些调整)。

我首先学习了Flex 2,因此不了解向量,这显然只是高效的单类型数组。

我需要在某个时候开始向前付款,因为这个论坛很棒(自从我10天前第一次发现它以来,在一些相当模糊的问题上有4个问题。)

再次感谢。