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

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

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)