Pasul 7
Pentru a raporta mesaje, vom folosi un TextField dinamic cu numele msg_txt. Pentru moment, adauga-l pe scena si lasa-l gol.
Pasul 8
Acum avem toate elementele, deci putem sa trecem la scrierea codului. In clasa ApplicationMain vom defini urmatoarele proprietati:
private var _target;
private var _image:ByteArray;
private var _filename = 'bitmapSnapshot.jpg';
De asemenea, in constructor vom initializa membrul _target cu movie clip-ul pe care l-am creat la Pasul 5:
this._target = this.export_mc;
Pasul 9
E momentul sa scriem functia pentru encodarea imaginii, deci adauga urmatorul cod in clasa ApplicationMain:
public function takeSnapshot():void{
var $width = _target.width;
var $height = _target.height;
var bmd:BitmapData = new BitmapData($width, $height, true, 0xFFFFFF);
bmd.draw(_target, new Matrix(), null, null, null, false);
var ext:String = this._filename.substr(-3);
if (ext == 'png') {
_image = PNGEncoder.encode(bmd);
}
else if (ext == 'jpg'){
var jpgEncoder:JPGEncoder = new JPGEncoder(100);
_image = jpgEncoder.encode(bmd);
}
}
Dupa cum poti observa, codul de mai sus calculeaza latimea si inaltimea movie clip-ului _target, apoi copiaza continutul acestuia intr-un obiect BitmapData cu aceleasi dimensiuni. In continuare, utilizand clasele adobe, obiectul BitmapData este transformat intr-un sir de octeti ce reprezinta de fapt o imagine .jpg sau .png.
In mod default, extensia este .jpg, dar o poti schimba in .png modificand proprietatea _filename din clasa noastra.
Nu uita ca la apasarea butonului trebuie sa apelezi aceasta functie, deci metoda btnExportPress() trebuie sa contina codul:
OBS. 1 Daca vrei sa salvezi un movie clip cu border, tine cont ca Flash nu calculeaza corect inaltimea si latimea acestuia, deoarece borderul este centrat pe conturul obiectului. Cu alte cuvinte, daca borderul este de 6px, trebuie sa retii dimensiunea movie clip-ului fara border si sa-i adaugi cate 3 px (adica jumatate din latimea borderului) pentru a afla inaltimea si latimea corecta.
OBS. 2 Mastile reprezinta o problema pentru ca ele sunt luate in considerare in calculul dimensiunilor. De asemenea, retine ca encodarea are loc pentru coordonate pozitive, deci elementele cu x sau y negativ din _target vor fi ignorate.
OBS. 3 Pentru formatul jpg sau jpeg, clasele implementate de adobe encodeaza imaginea transformand fiecare pixel din RGB in YCbCr (unde Y reprezinta luminozitatea, iar Cb si Cr sunt componentele cromatice). Imaginea este compusa octet cu octet, pornind de la headere si continuand cu octetii pentru fiecare pixel. Daca vrei sa schimbi modul de encodare al imaginii, de exemplu in Grayscale, ar trebui sa modifici headerele si sa renunti la cei doi octeti de culoare (Cb si Cr), ceea ce de fapt inseamna rescrierea algoritmului de conversie.
|
Pasul 10
Aproape am terminat, ceea ce mai trebuie sa faci este sa salvezi imaginea pe disc. Pentru a preveni o eroare, trebuie ca mai intai sa aflam versiunea playerului flash:
public function getFlashPlayerVersion(){
var versionNumber:String = Capabilities.version;
var versionArray:Array = versionNumber.split(",");
var length:Number = versionArray.length;
var platformAndVersion:Array = versionArray[0].split(" ");
var majorVersion:Number = parseInt(platformAndVersion[1]);
var minorVersion:Number = parseInt(versionArray[1]);
var buildNumber:Number = parseInt(versionArray[2]);
trace("Platforma: "+platformAndVersion[0]);
trace("Versiune principala: "+majorVersion);
trace("Versiune secundara: "+minorVersion);
trace("Build: "+buildNumber);
trace("-----");
return majorVersion;
}
Dupa ce ai scris metoda de mai sus, adauga linia urmatoare in functia takeSnapshot():
var flashVersion = this.getFlashPlayerVersion();
Pasul 11
Utilizand versiunea playerului aflata cu functia getFlashPlayerVersion(), vom raporta un mesaj de eroare daca aceasta este mai mica decat 10. In caz contrar, totul este in regula si putem salva imaginea pe disc, deci adauga codul de mai jos in metoda takeSnapshot():
if (flashVersion < 10){
this.msg_txt.text = "Eroare, trebuie sa ai instalat Flash Player 10";
}
else{
var saveFile:FileReference = new FileReference();
saveFile.addEventListener(Event.COMPLETE, saveCompleteHandler);
saveFile.addEventListener(Event.CANCEL, saveCancelHandler);
saveFile.addEventListener(IOErrorEvent.IO_ERROR, saveIOErrorHandler);
saveFile.save(_image, this._filename);
}
Poti observa ca am adaugat niste handlere pentru anumite evenimente (daca imaginea a fost salvata cu succes, daca s-a apasat butonul Cancel sau daca a survenit o eroare):
private function saveCompleteHandler(event:Event):void{
event.target.removeEventListener(Event.COMPLETE, saveCompleteHandler);
event.target.removeEventListener(Event.CANCEL, saveCancelHandler);
event.target.removeEventListener(IOErrorEvent.IO_ERROR, saveIOErrorHandler);
this.msg_txt.text = "Imaginea a fost salvata";
}
private function saveCancelHandler(event:Event):void{
event.target.removeEventListener(Event.COMPLETE, saveCompleteHandler);
event.target.removeEventListener(Event.CANCEL, saveCancelHandler);
event.target.removeEventListener(IOErrorEvent.IO_ERROR, saveIOErrorHandler);
this.msg_txt.text = "Actiune anulata";
}
private function saveIOErrorHandler(event:IOErrorEvent):void{
event.target.removeEventListener(Event.COMPLETE, saveCompleteHandler);
event.target.removeEventListener(Event.CANCEL, saveCancelHandler);
event.target.removeEventListener(IOErrorEvent.IO_ERROR, saveIOErrorHandler);
this.msg_txt.text = "Eroare la salvare";
}
OBS. 4 In cazul in care vrei ca aplicatia sa functioneze si pe versiuni anterioare ale playerului Flash, poti utiliza scripturi .php pentru a incarca (folosind URLRequest) si apoi descarca imaginea de pe server. Problema este ca orice fereastra deschisa din interiorul swf-ului tau va fi interpretata ca un pop-up si este foarte posibil ca ea sa fie blocata de browser.
|
Poti downloada sursa completa a acestui tutorial daca accesezi pagina de resurse. Nu ezitati sa-mi scrieti daca aveti intrebari.
|