Flash / Actionscript 3 Растровое изображение с растушеванными краями (размытые края) - PullRequest
2 голосов
/ 11 марта 2011

Я пытался найти хорошую стратегию для выполнения растрового кадрирования с использованием Actionscript3.

Например: у меня есть фотография автомобиля, и я хочу вырезать машину из одного изображения и растушевать края, чтобы они не выглядели неровными.

Я флеш-нуб и использую его всего пару недель. Я испробовал несколько вариантов, и вот последний, который я придумал: я помещаю красные точки на сцену, которые можно перетаскивать, чтобы вы могли выделить объект, который хотите обрезать, и точки являются границами для GradientFill, который используется в качестве маски растрового изображения. (Я использую радиальный градиент ... поэтому результаты далеки от желаемых, поскольку машина не является овальной).

Вот изображение результата. (игнорируйте случайный желтый пунктирный овал) GradientFill (radial) used as Bitmap mask

package code{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.events.MouseEvent;
//import flash.display.Graphics;
import fl.controls.Button;
import code.CropDot;
import flash.display.MovieClip;
import flash.display.GradientType;
import flash.display.SpreadMethod;
import flash.geom.Matrix;
import flash.display.Shape;

//import fl.controls.RadioButton;

public class BitmapEdit extends Sprite{

    public var maskee:MovieClip;
    public var bitmap:Bitmap;
    public var dots:Sprite;
    public var fill:MovieClip;
    public var numDots:int;
    public var circ:Shape = new Shape();

    ////////////////////    
    public var mat:Matrix=new Matrix();
    public var circRad:Number=50;

    public var offsetX:int;
    public var offsetY:int;

    public function BitmapEdit(bmp:Bitmap){
        trace("bitmapedit");

        //MASK Stuff
        //--------------
        bitmap = new Bitmap(bmp.bitmapData);
        maskee = new MovieClip();
        maskee.addChild(bitmap);

        fill = new MovieClip();
        this.addChild(maskee);
        this.addChild(fill);
        maskee.mask = fill;
        maskee.cacheAsBitmap = true;
        fill.cacheAsBitmap = true;

        // DOTS DOTS DOTS
        //---------------
        dots = new Sprite();

        numDots = 12;
        offsetX = 90;
        offsetY = 90;
        cX = dot0.x+offsetX;
        cY = dot0.y+offsetY;
        rangeX = [cX,cX];
        rangeY = [cY,cY];
        for(var i:int=0;i<numDots;i++){
            this['dot'+i.toString()].x += offsetX;
            this['dot'+i.toString()].y += offsetY;
            //this['dot'+i.toString()].name = 'dot'+i.toString();
            dots.addChild(this['dot'+i.toString()])
            cX+=dotX;
            cY+=dotY;
            if(dotX<=rangeX[0])
                rangeX[0]=dotX;
            else if(dotX>rangeX[1])
                rangeX[1]=dotX;
            if(dotY<=rangeY[0])
                rangeY[0]=dotY;
            else if(dotY>rangeY[1])
                rangeY[1]=dotY;
        }
        cdot.x = cX;
        cdot.y = cY;
        this.addChild(dots);

        fill.graphics.lineStyle(3,0,1.0,true);

        this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

    }
    public var cX:Number;
    public var cY:Number;
    public var dotX:Number;
    public var dotY:Number;
    public var prevdotX:Number;
    public var prevdotY:Number;
    public var rangeX:Array;
    public var rangeY:Array;

    protected function enterFrameHandler(e:Event){

        //draw lines between dots
        this.setChildIndex(fill,this.numChildren-2);
        this.setChildIndex(dots,this.numChildren-1);
        fill.graphics.clear();

        //-Draw Fill
        var fW = rangeX[1]-rangeX[0];
        var fH = rangeY[1]-rangeY[0];
        mat.createGradientBox(fW, fH, 0, cX-fW/2, cY-fH/2);
        //fill.graphics.beginFill(0,1);
        //fill.graphics.beginBitmapFill(bitmap.bitmapData);
        //mat = new Matrix();
        //fill.graphics.beginFill(0,1);
        fill.graphics.beginGradientFill(GradientType.RADIAL,[0x000000, 0x000000], [1, 0], [123,255], mat, SpreadMethod.PAD, "rgb", 0);

        fill.graphics.moveTo(dot0.x, dot0.y);
        cX = dot0.x;
        cY = dot0.y;
        prevdotX = dot0.x; 
        prevdotY = dot0.y;
        rangeX = [cX,cX];
        rangeY = [cY,cY];
        for(var i:int=1; i<numDots; i++){
            dotX = this['dot'+i.toString()].x;
            dotY = this['dot'+i.toString()].y;
            fill.graphics.lineTo( dotX, dotY);
            cX+=dotX;
            cY+=dotY;
            if(dotX<=rangeX[0])
                rangeX[0]=dotX;
            else if(dotX>rangeX[1])
                rangeX[1]=dotX;
            if(dotY<=rangeY[0])
                rangeY[0]=dotY;
            else if(dotY>rangeY[1])
                rangeY[1]=dotY;
        }
        cX/=numDots;
        cY/=numDots;
        //trace("ctr:"+cX+","+cY);
        cdot.x = cX;
        cdot.y = cY;
        fill.graphics.lineTo(dot0.x,dot0.y);
        // */



        //EndFill
        fill.graphics.endFill();

    }

    function toRad(a:Number):Number {
        return a*Math.PI/180;
    }
}
}

Вопросы

1) Как я могу растушевать только края этой нестандартной заливки, обведенной красными точками?

2) Я хочу сохранить изображение в файл после его обрезки. Какую стратегию было бы лучше сделать, используя BitmapFill или GradientFill в качестве маски (если это возможно с обоими)?

3) Возможно, я позже использую эту стратегию для обрезки лиц ... Кто-нибудь знает какие-либо хорошие API для обнаружения лиц для as3? (также API для обнаружения краев)

Спасибо всем впереди:)

1 Ответ

3 голосов
/ 11 марта 2011

1) я использовал создание прямоугольника (для своих нужд), но полигон должен работать ... в основном я создаю графику, применяю фильтр размытия и использую его в качестве маски.(вместо использования градиента)

2) взгляните на структуру рекламы , там есть один класс, который позволяет вам экспортировать изображения (tif, png), но есть и другиевыбор.В основном, если вы создаете растровое изображение и используете функцию рисования, вы можете иметь растровое изображение для экспорта,

3) вам следует взглянуть на каскады Хаара в as3, вот одна ссылка с большим количеством информации для этого, это довольномедленно в as3 на данный момент, но кто знает, может быть, с новыми API кротовины это может скоро измениться.http://web.elctech.com/2009/04/02/using-haar-cascades-and-opencv-in-as3/

...