[ActionScript 3.0] AS3.0 模拟套索工具抠图的两种方法

方法之一:遮罩法

package com.fylibs.tools
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;

    /**
     * @author:Frost.Yen
     * @E-mail:[email protected]
     * @create:    2016-6-30 上午11:46:23
     *
     */
    public class LassoTool2
    {
        private var _editor:Sprite;
        private var _outline:Sprite = new Sprite();
        private var _mask:Sprite = new Sprite();
        private var _cords:Vector.<Point>=new Vector.<Point>;
        private var _copyBmp:Bitmap = new Bitmap();
        private var _copyContainer:Sprite = new Sprite();
        private var _source:BitmapData;
        private var _curr:Sprite;
        public function LassoTool2(e:Sprite,source:BitmapData)
        {
            _editor = e;
            _source = source;
            _copyBmp.bitmapData = _source.clone();
            _copyContainer.addChild(_mask);
            _copyContainer.addChild(_copyBmp);
            _copyBmp.mask = _mask;
            _editor.addChild(_copyContainer);
            _editor.addChild(_outline);

            addEventListeners();
        }
        private function addEventListeners():void
        {
            _editor.addEventListener(MouseEvent.MOUSE_DOWN,onEditorDown);
        }
        private function onEditorDown(e:MouseEvent):void
        {
            _editor.addEventListener(MouseEvent.MOUSE_MOVE,onEditorMove);
            _editor.addEventListener(MouseEvent.MOUSE_UP,onEditorUp);
            _cords = Vector.<Point>([]);
            _cords.push(getPosition());

            _outline.graphics.clear();
            _outline.graphics.lineStyle(1,0xffffff,0.8);
            _outline.graphics.moveTo(_editor.mouseX,_editor.mouseY);

            _mask.graphics.clear();
            _mask.graphics.lineStyle(1,0xffffff,0.8);
            _mask.graphics.moveTo(_editor.mouseX,_editor.mouseY);
        }
        private function onEditorMove(e:MouseEvent):void
        {
            _cords.push(getPosition());
            _outline.graphics.lineTo(_editor.mouseX,_editor.mouseY);
        }
        private function onEditorUp(e:MouseEvent):void
        {
            _editor.removeEventListener(MouseEvent.MOUSE_MOVE,onEditorMove);
            _editor.removeEventListener(MouseEvent.MOUSE_UP,onEditorUp);
            _outline.graphics.lineTo(_cords[0].x,_cords[0].y);
            _mask.graphics.lineTo(_cords[0].x,_cords[0].y);
            //trace(_outline.getRect(_editor));

            fillSelection(_outline);
            fillSelection(_mask);

            var rect:Rectangle = _outline.getRect(_editor);
            var temp:BitmapData = new BitmapData(rect.width,rect.height,true,0);
            var matrix:Matrix = new Matrix();
            matrix.translate(-rect.x,-rect.y);
            temp.draw(_copyContainer,matrix);

            var sp:Sprite = new Sprite();
            var bmp:Bitmap = new Bitmap(temp);
            sp.x = rect.x;
            sp.y = rect.y;
            sp.addChild(bmp);
            _editor.addChild(sp);

            sp.addEventListener(MouseEvent.MOUSE_DOWN,onCutDown);
        }

        private function onCutDown(e:MouseEvent):void
        {
            e.stopImmediatePropagation();
            _curr = e.currentTarget as Sprite;
            _curr.startDrag();
            e.currentTarget.parent.stage.addEventListener(MouseEvent.MOUSE_UP,onCutUp)
        }
        private function onCutUp(e:MouseEvent):void
        {
            _curr.stopDrag();
            e.currentTarget.removeEventListener(MouseEvent.MOUSE_UP,onCutUp);
        }
        private function getPosition():Point
        {
            return new Point(_editor.mouseX,_editor.mouseY);
        }
        private function fillSelection(target:Sprite):void
        {
            target.graphics.beginFill(0xffffff);
            target.graphics.moveTo(_cords[0].x,_cords[0].y);
            for(var i:int=1;i<_cords.length;i++){
                target.graphics.lineTo(_cords[i].x,_cords[i].y);
            }
            target.graphics.lineTo(_cords[0].x,_cords[0].y);
            target.graphics.endFill();
        }
    }
}

方法之二:像素填充法

package com.fylibs.tools
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import flash.geom.Rectangle;

    /**
     * @author:Frost.Yen
     * @E-mail:[email protected]
     * @create:    2016-6-29 上午10:36:08
     *
     */
    public class LassoTool1 extends Object
    {
        private var _editor:Sprite;
        private var _outline:Sprite = new Sprite();
        private var _cords:Vector.<Point>=new Vector.<Point>;
        private var _mask:BitmapData;
        private var _source:BitmapData;
        private var _curr:Sprite;
        public function LassoTool1(e:Sprite,source:BitmapData)
        {
            _editor = e;
            _source = source;
            addEventListeners();
        }
        private function addEventListeners():void
        {
            _editor.addEventListener(MouseEvent.MOUSE_DOWN,onEditorDown);
        }
        private function onEditorDown(e:MouseEvent):void
        {
            _editor.addEventListener(MouseEvent.MOUSE_MOVE,onEditorMove);
            _editor.addEventListener(MouseEvent.MOUSE_UP,onEditorUp);
            _cords = Vector.<Point>([]);
            _cords.push(getPosition());
            _editor.addChild(_outline);
            _outline.graphics.clear();
            _outline.graphics.lineStyle(1,0xffffff,0.8);
            _outline.graphics.moveTo(_editor.mouseX,_editor.mouseY);
        }
        private function onEditorMove(e:MouseEvent):void
        {
            _cords.push(getPosition());
            _outline.graphics.lineTo(_editor.mouseX,_editor.mouseY);
        }
        private function onEditorUp(e:MouseEvent):void
        {
            _editor.removeEventListener(MouseEvent.MOUSE_MOVE,onEditorMove);
            _editor.removeEventListener(MouseEvent.MOUSE_UP,onEditorUp);
            _outline.graphics.lineTo(_cords[0].x,_cords[0].y);

            //trace(_outline.getRect(_editor));

            fillSelection(_outline);
            var rect:Rectangle = _outline.getRect(_editor);
            if(_mask){
                _mask.dispose();
            }
            _mask = new BitmapData(_editor.width,_editor.height,true,0xffffff);
            _mask.draw(_outline);

            //getDraws(_mask,rect,0xffffff);

            var bmpd:BitmapData = new BitmapData(rect.width,rect.height,true,0);
            setPixels(bmpd,rect,getPixels(_source,rect,getDraws(_mask,rect,0xffffffff)));

            var sp:Sprite = new Sprite();
            var bmp:Bitmap = new Bitmap(bmpd);
            sp.x = rect.x;
            sp.y = rect.y;
            sp.addChild(bmp);
            _editor.addChild(sp);

            sp.addEventListener(MouseEvent.MOUSE_DOWN,onCutDown);
        }

        private function onCutDown(e:MouseEvent):void
        {
            e.stopImmediatePropagation();
            _curr = e.currentTarget as Sprite;
            _curr.startDrag();
            e.currentTarget.parent.stage.addEventListener(MouseEvent.MOUSE_UP,onCutUp)
        }
        private function onCutUp(e:MouseEvent):void
        {
            _curr.stopDrag();
            e.currentTarget.removeEventListener(MouseEvent.MOUSE_UP,onCutUp);
        }
        private function getPosition():Point
        {
            return new Point(_editor.mouseX,_editor.mouseY);
        }
        private function fillSelection(target:Sprite):void
        {
            target.graphics.beginFill(0xffffff);
            target.graphics.moveTo(_cords[0].x,_cords[0].y);
            for(var i:int=1;i<_cords.length;i++){

                target.graphics.lineTo(_cords[i].x,_cords[i].y);
            }
            target.graphics.lineTo(_cords[0].x,_cords[0].y);
            target.graphics.endFill();
        }
        private function getDraws(source:BitmapData,rect:Rectangle,findColor:uint):Vector.<Point>
        {
            source.lock();
            var draws:Vector.<Point> = new Vector.<Point>;
            for(var i:int=0;i<rect.width;i++){
                for(var j:int=0;j<rect.height;j++){
                    if(source.getPixel32(i+rect.x,j+rect.y) == findColor){
                        draws.push(new Point(i+rect.x,j+rect.y));
                    }
                }
            }
            //trace(draws.length,findColor);
            source.unlock();
            return draws;
        }
        private function getPixels(source:BitmapData,rect:Rectangle,draws:Vector.<Point>):Vector.<Object>
        {
            source.lock();
            var objV:Vector.<Object> = new Vector.<Object>;
            for(var i:int=0;i<draws.length;i++){
                var obj:Object = {};
                obj.p = draws[i];
                obj.color = source.getPixel32(draws[i].x,draws[i].y);
                objV.push(obj);
            }
            source.unlock();
            return objV;
        }
        private function setPixels(target:BitmapData,rect:Rectangle,color:Vector.<Object>):BitmapData
        {
            target.lock();
            for(var i:int = 0;i<color.length;i++){
                target.setPixel32(color[i].p.x-rect.x,color[i].p.y-rect.y,color[i].color);
            }
            target.unlock();
            return target;
        }
    }
}

调用方法:

package
{
    import com.fylibs.tools.LassoTool1;
    import com.fylibs.tools.LassoTool2;

    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;

    /**
     * @author:Frost.Yen
     * @E-mail:[email protected]
     * @create:    2016-6-29 上午10:40:54
     *
     */
    [SWF(width="1920",height="1080",backgroundColor="0xcccccc")]
    public class TestLasso extends Sprite
    {
        private var _editor:Sprite;
        private var _lassoTool:LassoTool2;
        [Embed(source="QQ图片20150811130307.jpg")]
        private var Source:Class;
        public function TestLasso()
        {
            super();
            _editor = new Sprite();
            this.addChild(_editor);
            var bmp:Bitmap = new Source();
            _editor.addChild(bmp);
            if(!_lassoTool){
                _lassoTool = new LassoTool2(_editor,bmp.bitmapData);
            }
        }
    }
}
时间: 2024-08-03 09:44:58

[ActionScript 3.0] AS3.0 模拟套索工具抠图的两种方法的相关文章

c# 调用win32模拟点击的两种方法

第一种 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication2 { public part

php在数字前面补0得到固定长度数字的两种方法

比较基础,其实两个内置函数都能实现. 1  sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料处理 本函数用来将字符串格式化.参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止.而在转换的格式间依序包括了 填空字符.0 的话表示空格填 0:空格是默认值,表示空格就放着. 对齐方式.默认值为向右对齐,负号表向左对齐. 字段宽度.为最小宽度. 精确度.指在小数点后的浮点数位数.

MVC4.0中下来列表框的,两种使用方法DropDownList

后台控制器代码 public ActionResult Drop() { var list = new List<SchoolInfo>(); list.Add(new SchoolInfo() { SchoolID = 1, SName = "北京大学" }); list.Add(new SchoolInfo() { SchoolID = 2, SName = "上海大学" }); var model = new UserViewInfo(); mod

Android模拟点击的两种方式

导论 在Android中模拟一个点击事件有两种方式是通过模拟MotionEvent来实现:一种是通过ADB来实现 第一种:模拟MotionEvent 通用方法如下: private void setSimulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain(downTime, dow

VB模拟键盘输入的N种方法

VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件.那么我们怎样才能用VB来写一个程

CURL模拟POST提交的二种方法实例

CURL应用广范,本文来介绍CURL模拟POST提交的二种方法实例,他们都是返回json字符串格式. 方法一(返回的是json字符串格式): /** * Curl版本 * 使用方法: * $post_string = "app=request&version=beta"; * request_by_curl('http://facebook.cn/restServer.php',$post_string); */ function actionPost($url,$data){

[ActionScript 3.0] AS3.0和AS2.0的相互通信

AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) { var param = "this message is from as2"; var caller:LocalConnection = new LocalConnection(); caller.send("AS2 send to AS3","funI

yii2.0高级框架配置时打开init.bat秒退的解决方法 (两种方法)

第一种: 这几天刚接触到yii2.0框架,在配置advanced版本时运行init.bat初始化文件时老是闪退: 用cmd运行该文件时显示:The OpenSSL PHP extension is required by Yii2.如下图所示: 搜索了很多资料,终于找到问题所在之处了,原来是php.ini中的extension=php_openssl.dll没有打开: 1.打开php.ini文件,如我的目录是D:\wamp\php\php.ini,搜索extension=php_openssl.

python爬虫:两种方法模拟登录博客园

第一方法用第三方库(requests):参考http://www.mamicode.com/info-detail-1839685.html 源代码分析 博客园的登录页面非常简单,查看网页源代码,可以发现两个输入框的id分别为input1.input2,复选框的id为remember_me,登录按钮的id为signin. 还有一段JavaScript代码,下面来简单分析一下. 先来看$(function(){});函数: 1 $(function () { 2 $('#signin').bind