[air] enregistrer localement une image créée dynamiquement

Soyez le premier à donner votre avis sur cette source.

Vue 6 468 fois - Téléchargée 349 fois

Description

Suite au problème soulevé dans la source précédente (CLASSE PNGENCODER par Blacknight) sur l'enregistrement en local d'une image générée à la volée et encodée en PNG, je me suis penché sur le problème avec l'aide du cookbook de Adobe pour AIR (lien dispo dans la conclusion).

Cette astuce est très utile, c'est pour ça que je l'ai pas laissé en commentaire, et que j'ai posté une source exprès.

Dans la source je décris les deux dossiers en rapport avec l'application :
  • applicationStorageDirectory : qui renvoie à un dossier dans AppData pour Windows et dans la Bibliothèque pour Mac.

Attention ! : ce dossier n'est pas supprimé avec la désinstallation AIR (sur Mac en tout cas), donc à utiliser avec modération.
  • applicationDirectory : qui renvoie au dossier où est situé le .exe pour Windows (typiquement C:/Program Files/Mon Application) et au dossier monApplication.app/Contents/Resources/ pour Mac.


A noter : dans les deux cas un Loader fonctionne avec le même URL car les fichiers sont organisés de la même façon, relativement au SWF.

A noter bis : Il est aussi possible d'enregistrer les données dans un dossier crypté (Encrypted Local Store), pour une sécurité maximale. Il paraît qu'il ne faut cependant pas dépasser les 10 Mo, car après les performances sont altérées.
Ce n'est pas la même méthode, il sera bon de faire une autre source :)
Vous avez cependant le descriptif du cookbook dans la conclusion

J'ai modifié le ciblage du dossier et de l'image suivant les consignes de Pegase. En effet, c'est beaucoup plus simple et cela permet de cibler le dossier sans le créer pour tester notamment, comme il l'explique si le fichier existe.

Source / Exemple :


import PNGEncoder;

/**** AFFICHAGE DE L'IMAGE PAR BLACKNIGHT : (cf source précédene) ****/

var myPicture:BitmapData=new BitmapData(100,100,true,0x00000000);

for (var i:int=0; i<100; i++) {
	myPicture.fillRect(new Rectangle(100*Math.random(),100*Math.random(),10*Math.random(),10*Math.random()),0xFFFFFFFF*Math.random());
}

var image:Bitmap = new Bitmap(myPicture);

addChild(image);

image.x = 70;
image.y = 15;

/**** VARIABLES ****/

// dossier de l'application dans les dossiers "système"
var dossier:File = File.applicationStorageDirectory;

/******************* /!\ /!\ /!\ /!\/!\ ********************

File.applicationStorageDirectory renvoit au dossier de "configuration" de l'application.

Ce dossier est situé dans AppData/Roaming/com.adobe.example.VOTREPROJET pour Vista
et dans Bibliothèque > Préférences > com.adobe.example.VOTREPROJET Pour les macs

Pour enregistrer dans le dossier de l'application, il faut utiliser >>> File.applicationDirectory <<<

Ça enregistre dans le dossier de l'application sous Windows (genre C:/Program Files/Mon App/)
et DANS le .app sous mac (dans monApp.app/Contents/Resources/)

Dans n'importe quel cas les loader fonctionnent car sous Windows c'est le exe qui charge
et pour les macs c'est le main.swf contenu dans monApp.app/Contents/Resources/ qui charge.

                                                                                                                      • /
// image finale dans l'ordi var imageEnregistree:File = dossier.resolvePath("enregistrees/image.png"); // les variables de dossiers ont été changées suite au commentaire de Pegase. Déjà c'est plus simple, plus explicite, et en plus, on pourra faire des tests plus tard sur ce chemin ciblé /****** ENREGISTREMENT *******/ function enregistrerFct (evt:Event) { // On encode en PNG var monPNGByte:ByteArray = PNGEncoder.encode(myPicture); // on ouvre le filestream pour écrire (en l'occurence) sur l'ordi var stream:FileStream = new FileStream(); // on ECRIT sur l'emplacement de l'image défini plus haut stream.open(imageEnregistree, FileMode.WRITE); // on écrit quoi ? Le bytearray bien sûr :) stream.writeBytes(monPNGByte); // Et on ferme la porte pour éviter les courants d'air stream.close(); confEnregistrement.text = "Enregistrée sous "+imageEnregistree.url; } enregistrer.addEventListener(MouseEvent.CLICK, enregistrerFct); /***** REAFFICHAGE ******/ // Là, rien de bien sorcier... Le loader fonctionne... function afficherFct (evt:Event) { if(imageEnregistree.exists) { var chargeur:Loader = new Loader(); chargeur.load(new URLRequest(imageEnregistree.url)); addChild(chargeur); chargeur.x = 86; chargeur.y = 270; } } charger.addEventListener(MouseEvent.CLICK, afficherFct);

Conclusion :


Adobe AIR Cookbook Beta : http://www.adobe.com/cfusion/communityengine/index.cfm?event=homepage&productId=4

Adobe AIR cookbook beta - Safeguarding Files with the Encrypted Local Store : http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&postid=10463&loc=en_US&productid=4

Voilà, première source AIR, non ?

PS. : désolé pour le design quelque peu rudimentaire, mais j'ai posté pour le code seulement.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
9
Le problème c'est que le Fla c'est du Flash .. donc le mieux est de faire le AIR/Flash ici et le AIR/Flex sur le site prévu pour.

Flex est un langage à part, même s'il utilise de l'ActionScript, donc une source Flex ne pourra pas être lu par flash et l'inverse aussi. Même s'ils peuvent tout les deux faire du AIR au final.

Peg'
Messages postés
337
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
4 janvier 2011

Bonjour,

Après un rapide coup d'œil la source a l'air pas mal (je regarderai ce soir)

Mais c'est normal que peut de sources AIR ici car en principe le forum FLEX et la pour ça... (vu que c'est le forum FLEX & AIR :D)

Peut etre devrais tu la poster la bas aussi histoire que le forum ne meurent pas prématurément...
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
9
Double post (si, si, j'ai le droit ;) ) juste pour dire qu'il est maintenant possible d'enregistrer sur l'ordinateur local avec "FileRéférence.save()", dans cs4 (nouveauté !!!)

Seulement, on est obligé de passer par une boîte de dialogue pour laisser l'utilisateur le faire à sa guise ('faut pas pousser non plus). Donc enregistrer des fichiers sur l'ordi local via flash sur internet est maintenant possible !

Peg'
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
9
à la place de :

var dossier:File = File.applicationStorageDirectory.resolvePath("enregistrees/");
var imageEnregistree:File = new File(dossier.nativePath+File.separator+"image.png");

il est plus correcte de mettre :

var dossier:File = File.applicationStorageDirectory;
var imageEnregistree:File = dossier.resolvePath("enregistrees/image.png");

Celà permet de savoir si le dossier existe déjà, par exemple, lors du post-traitement ... pour (encore par exemple) éviter les écrasements.

Peg' ;)

Ps: oui, AIR, j'en suis en train de faire le tour et j'ai déjà des astuces (merci EbarSoft)
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
Hello chers Ami,

Très bonne source, en effet la première exploitant AIR il me semble.
Il serait donc temps pour la communauté de Flashkod de passer définitivement à ActionScript 3 afin de constater son énorme potentiel !

Source compréhensible et correctement rédigé. Niveau Initié puisque utilisation de AIR (bien que...).

De bonne base pour la manipulation de fichier avec AIR.

Bravo !

Blacknight
Note : 10/10, rien à redire.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (WhiteMagus)