Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сохранение изображения, фильтр, объекты (http://www.flasher.ru/forum/showthread.php?t=202872)

timedo 16.08.2013 13:53

Сохранение изображения, фильтр, объекты
 
Вложений: 3
Здравствуйте. Начал изучать 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.(прикреплены ниже)

SvetozarPNZ 16.08.2013 15:31

Броско посмотрел - не нашел размеры fotoHolder, которые вы в последствии отрисовываете в битмапдату. В крайнем случае можно отрисованную битмапдату обрезать, чтобы удалить лишнее.


Часовой пояс GMT +4, время: 17:03.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.