Я пытался найти хорошую стратегию для выполнения растрового кадрирования с использованием Actionscript3.
Например: у меня есть фотография автомобиля, и я хочу вырезать машину из одного изображения и растушевать края, чтобы они не выглядели неровными.
Я флеш-нуб и использую его всего пару недель. Я испробовал несколько вариантов, и вот последний, который я придумал: я помещаю красные точки на сцену, которые можно перетаскивать, чтобы вы могли выделить объект, который хотите обрезать, и точки являются границами для GradientFill, который используется в качестве маски растрового изображения. (Я использую радиальный градиент ... поэтому результаты далеки от желаемых, поскольку машина не является овальной).
Вот изображение результата. (игнорируйте случайный желтый пунктирный овал)
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 для обнаружения краев)
Спасибо всем впереди:)