Здравствуйте. Начал изучать as3 но потом пришло лето, сейчас взялся заново все проделывать, но вопросов как обычно больше чем ответов. Прошу за код сильно не ругать =)
В общем хочу создать такое приложение, к примеру загружаешь любую фотографию и можно подставить к ней усы либо шляпу(например загрузили лицо, подставили усы), так же можно использовать фильтр типа "сепия", если не нравится - отключить.
1. У меня не получается подставлять усы когда включен фильтр. Я понимаю что в моем случае на 1 сцену налаживается 2 сцена с красной картинкой, из-за этого все обьекты находятся в 1 сцене. Но я не пойму как сделать в коде что б все работало как нужно.
2. Сохранение. У меня сцена - это
fotoHolder. При сохранении, сохраняется картинка и вся сцена, при открытии картинки уже на компьютере, получается не очень красиво, как бы картинка а позади нее белый фон(прикреплена миниатюра), как сделать так что б сохраняло лишь одну картинку?
Вот и сам код:

Код AS3:
import com.ryan.geom.*;
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.filters.ColorMatrixFilter;
import flash.display.Bitmap;
import flash.net.FileReference;
var fileRef:FileReference;
var pLoader:Loader;
var fotoHolder_Width:Number;
var fotoHolder_Height:Number;
var fotoHolder:MovieClip;
var textTypeFilter:FileFilter;
var moreThanZero:Boolean;
var a_mustaches:Vector.<mustaches> = new <mustaches>[]; // обьект усы
var a_heads:Vector.<heads> = new <heads>[]; // обьект шляпа
var freeTMs:Vector.<FreeTransformManager> = new <FreeTransformManager>[]; // свободная трансформация
mustache.addEventListener( MouseEvent.CLICK, createNewMustache ); // при нажатие на усы
head.addEventListener( MouseEvent.CLICK, createNewHead ); // при нажатии на шляпу
red.addEventListener( MouseEvent.CLICK, RedColor ); // при нажатии на красный квадрат
none.addEventListener( MouseEvent.CLICK, NoneClor ); // при нажатии белый квадрат
saveImg.addEventListener( MouseEvent.CLICK, mySaveImg ); // при нажатии на сохранить
function createNewMustache( event:MouseEvent ):void // создаем новый ус =)
{
var newMustache:mustaches = new mustaches();
a_mustaches.push( newMustache );
fotoHolder.addChild( newMustache );
var freeTransformManager:FreeTransformManager = new FreeTransformManager();
freeTransformManager.boundingBoxOutlineColor = 0xff0000;
freeTransformManager.boundingBoxOutlineThickness = 2;
freeTransformManager.handleFillColor = 0xff0000;
freeTransformManager.handleOutlineColor = 0xff0000;
freeTransformManager.handleRadius = 6;
freeTransformManager.registerSprite( newMustache,{ minScale:0.1, maxScale:4 } );
freeTMs.push( freeTransformManager );
}
function createNewHead( event:MouseEvent ):void // создаем новую шляпу
{
var newHead:heads = new heads();
a_heads.push( newHead );
fotoHolder.addChild( newHead );
var freeTransformManager:FreeTransformManager = new FreeTransformManager();
freeTransformManager.boundingBoxOutlineColor = 0xff0000;
freeTransformManager.boundingBoxOutlineThickness = 2;
freeTransformManager.handleFillColor = 0xff0000;
freeTransformManager.handleOutlineColor = 0xff0000;
freeTransformManager.handleRadius = 6;
freeTransformManager.registerSprite( newHead,{ minScale:0.1, maxScale:4 } );
freeTMs.push( freeTransformManager );
}
var raw1:BitmapData = new BitmapData( fotoHolder.width,fotoHolder.height );
var bitmap1:Bitmap = new Bitmap(raw1);
/*Заливаем все красным, делаем как бы фото фильтр*/
function RedColor(event:MouseEvent):void {
var delitel=0;
raw1.draw( fotoHolder, fotoHolder.transform.matrix );
addChild(bitmap1);
bitmap1.x=0;
bitmap1.y=0;
bitmap1.filters = [new ColorMatrixFilter([0.403,0.327,0.617,0.444,-65,0.634,0.23,0.921,0.311,-176,0.104,0.358,0.066,0.887,-208,0.864,0.562,0.552,0.802,-129])];
}
/*убираем фото фильтр*/
function NoneClor(event:MouseEvent):void {
removeChild(bitmap1);
}
/*cохраняем картинку*/
function mySaveImg(event:MouseEvent):void
{
fotoHolder.x = 1;
fotoHolder.y = 5;
var raw:BitmapData = new BitmapData( fotoHolder.width,fotoHolder.height );
raw.draw( fotoHolder, fotoHolder.transform.matrix );
var brr:ByteArray = PNGEncoder.encode( raw );
var fil:FileReference = new FileReference();
fil.save( brr, "image.png" );
}
/******Открываем фотографию(код взят с постороннего источника)*******/
fotoHolder_Width=447; // ширина сцены
fotoHolder_Height=339; //высота сцены
pLoader=new Loader();
fotoHolder.addChild(pLoader);
fileRef=new FileReference();
textTypeFilter=new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)","*.jpg;*.jpeg;*.gif;*.png");
fileRef.addEventListener(Event.SELECT, onFileSelected); // юзер выбрал файл в диалоге
openFile.addEventListener("mouseDown",selectFotoPressedHandler); // нажатие на кнопку открытия файла "Выбрать фото"
function onFileSelected(evt:Event):void {
fileRef.addEventListener(Event.COMPLETE, onComplete);
fileRef.load();
}
function selectFotoPressedHandler(e:Event) {
trace("selectFotoPressed");
GoSelectFoto();
}
function onComplete(evt:Event):void {
moreThanZero=false;
fotoHolder_Width=447;
fotoHolder_Height=339;
pLoader.loadBytes(fileRef.data);
addEventListener("enterFrame",entrFrameHandler);
}
function GoSelectFoto() {
fileRef.browse([textTypeFilter]); // выбор файла посредством открытия стандартного диалога браузера
}
function entrFrameHandler(e:Event) {
if (! moreThanZero) {
if (pLoader.width>0) {
moreThanZero=true;
resizePicture();
} else {
trace("waiting...");
} } }
function resizePicture() {
var delitel=0;
pLoader.x=0;
pLoader.y=0;
if (pLoader.width>fotoHolder_Width || pLoader.width<fotoHolder_Width) {
delitel=pLoader.width/fotoHolder_Width;
pLoader.width=pLoader.width/delitel;
pLoader.height=pLoader.height/delitel;
}
if (pLoader.height>fotoHolder_Height || pLoader.height>fotoHolder_Height) {
delitel=pLoader.height/fotoHolder_Height;
pLoader.height=pLoader.height/delitel;
pLoader.width=pLoader.width/delitel;
}
pLoader.x=(fotoHolder_Width-pLoader.width)/2;
pLoader.y=(fotoHolder_Height-pLoader.height)/2;
trace("resized");
}
Исходники сохранены для flash версии cs5 и cs6.(прикреплены ниже)