Здравствуйте. Начал изучать as3 но потом пришло лето, сейчас взялся заново все проделывать, но вопросов как обычно больше чем ответов. Прошу за код сильно не ругать =) В общем хочу создать такое приложение, к примеру загружаешь любую фотографию и можно подставить к ней усы либо шляпу(например загрузили лицо, подставили усы), так же можно использовать фильтр типа "сепия", если не нравится - отключить. 1. У меня не получается подставлять усы когда включен фильтр. Я понимаю что в моем случае на 1 сцену налаживается 2 сцена с красной картинкой, из-за этого все обьекты находятся в 1 сцене. Но я не пойму как сделать в коде что б все работало как нужно. 2. Сохранение. У меня сцена - это fotoHolder. При сохранении, сохраняется картинка и вся сцена, при открытии картинки уже на компьютере, получается не очень красиво, как бы картинка а позади нее белый фон, как сделать так что б сохраняло лишь одну картинку? Вот и сам код: Код | 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. cs5 http://yadi.sk/d/X8GeOhlG7ypkScs6 http://yadi.sk/d/Pf8hTQnO7ypku
|