0

我一直在尝试将从相机输入捕获的位图转换为矢量,然后将矢量点转换为数组以供以后使用。

但是我在 Flash 中找不到任何此类功能,因此我一直在尝试使用Corey O'Neil创建的“矢量化包” 。这似乎有效,但无法删除我的位图上的白色背景(我正在捕捉一张带有线条的纸张图片)。即使手动执行此操作并使背景透明仍然不会产生任何结果。

这是我的代码:

public class DocumentRich extends MovieClip{

    public var initBox2D:Main;
    var cam:Camera = Camera.getCamera(); 
    var vid:Video = new Video(420, 300); 
    var myVector:Vectorize;
    public function DocumentRich()
    {
        if(stage){
            initBox2D = new Main();
            addChild(initBox2D);
            //addChild(new movieMonitor());
        } 

        addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
        StartAnim();


    }

    function StartAnim():void
    {
        //SET UP WORLD
        initBox2D.isDebugMode(false);
        initBox2D.mouseDragEnabled(true);
        Main.world.SetGravity(new b2Vec2(0,0));


        cam.setQuality(0, 100);
        cam.setMode(420, 300, 30, true);
        trace(cam.height);
        vid.attachCamera(cam); 
        addChild(vid);
        addChild(go);
    }

    function clickHandler(m:MouseEvent){
        trace(m.target.name);
        switch(m.target.name){
            case 'go':
                goButtonFun();
            break;

        }
    }

    function goButtonFun():void{
        var screenShot:BitmapData = new BitmapData(cam.width, cam.height); 
        var screenShot_image:Bitmap=new Bitmap(screenShot);
        screenShot.draw(vid) ;
        ReduceColors.reduceColors(screenShot, 0, true, false);
        screenShot.colorTransform(new Rectangle(0, 0, screenShot.width, screenShot.height), new ColorTransform(2,2,2,1) );

        ///// --------- MAY NOT NEED THIS ----------- ////////////
        for(var i:int = 0; i<screenShot.width; i++)
        {
            for(var j:int = 0; j<screenShot.height; j++)
            {
                if(screenShot.getPixel(i,j) == 0xffffff)
                {
                    var transparent:uint = 0x00000000;
                    screenShot.setPixel32(i, j, transparent);
                }
            }
        }

        myVector = new Vectorize(screenShot_image, 23, 2, 1, 3, 0xFFFFFF);
        myVector.addEventListener(Vectorize.INIT, traceStatus);
        myVector.addEventListener(Vectorize.DESPECKLE_START, traceStatus);
        myVector.addEventListener(Vectorize.DESPECKLE_COMPLETE, traceStatus);
        myVector.addEventListener(Vectorize.GROUPING_START, traceStatus);
        myVector.addEventListener(Vectorize.GROUPING_COMPLETE, traceStatus);
        myVector.addEventListener(Vectorize.EDGING_START, traceStatus);
        myVector.addEventListener(Vectorize.EDGING_COMPLETE, traceStatus);

        myVector.addEventListener(Vectorize.DESPECKLE_PROGRESS, traceProgress);
        myVector.addEventListener(Vectorize.GROUPING_PROGRESS, traceProgress);
        myVector.addEventListener(Vectorize.EDGING_PROGRESS, traceProgress);

        myVector.addEventListener(Vectorize.COMPLETE, showVector);
        myVector.vectorize();

        //addChild(screenShot_image);
        addChild(go);
        removeChild(vid);
        cam = null;
        vid.attachCamera(null);
        vid = null;
    }

    function traceStatus(event:Event):void
    {
        trace(event.type);
    }
    function traceProgress(event:Event):void
    {
        var progress:int = event.target.percentDone * 100;
        trace(event.type + ": " + progress + "%");
    }
    function showVector(event:Event):void
    {
        trace(event.type);
        addChild(myVector);
    }

}

有什么建议么?

谢谢。

更新: 抱歉有任何混淆,基本上我想要一种跟踪透明位图的方法,并在所述位图中获取形状点的数组。像素数据数组太大了......我想要一个矩形的 4 个点,不管它的大小......

4

1 回答 1

0

显然您正在寻找BitmapData.getVector()。它可从 Flash player 10 获得,因此您应该可以随意使用它。

编辑:在我重读您的问题后,我了解您希望将您的位图解析为矢量 - 并且矢量不是像素数组,而是某一行的开始和结束。那么是的,如果您能够调用 athreshold()以使线条的像素为一种颜色,而背景为另一种颜色,那么您可以调用getColorBoundsRect()并查询矩形的所有 4 个角。具有线条颜色的是您的开始和结束坐标,存储这些。

于 2013-10-24T18:24:56.890 回答