Sauvegarder un jpg (as3)

Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010 - 11 nov. 2009 à 13:02
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010 - 12 nov. 2009 à 21:22
Bonjour tout le monde,
Je suis entrain de faire un générateur d'avatar et je bloque à un point essentiel, la sauvegarde de l'avatar.
Alors j'ai testé plusieurs code, mais à chaque fois que je clique sur le bouton enregistrer j'enregistre une image banche... ce qui est assez déprimant.
Donc pour expliquer un peu la démarche,
J'ai un movieclip dans lequel j'ajoute des uiloader dont les sources sont des images png.
Et j'essaye de sauvegarder ce movieclip.

Voici une partie de mon code:
	var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
var jpgURLRequest:URLRequest = new URLRequest("jpg_encoder_download.php?name=avatar_by_kps.jpg");
jpgURLRequest.requestHeaders.push(header);
jpgURLRequest.method = URLRequestMethod.POST;
if (global_variable.taille_choisie == 130){
addChild (Clip_130);
Clip_130.visible = true;
var jpg_130:BitmapData = new BitmapData (taille_reduite2, taille_reduite2);
jpg_130.draw(Clip_130);
var jpgStream_130:ByteArray = jpgEncoder.encode(jpg_130);
jpgURLRequest.data = jpgStream_130;
navigateToURL(jpgURLRequest, "_blank");


Donc en live ça donne ça:
[url]http://hanser.perso.neuf.fr/Amaury/generateur_avatar_2//url
Comme vous le voyez, ça ne marche pas.
Mais je n'ai aucune espèce d'idée du pourquoi ça ne marche pas.
Si l'un de vous peut m'aider, que ce soit en corrigeant le problème ou en apportant une autre solution, je lui en serai très reconnaissant.
Par avance, je vous remercie.

14 réponses

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 nov. 2009 à 13:47
Bonjour,

tu veux sauvegarder l'image sur le serveur ?

Peg'
0
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
11 nov. 2009 à 14:31
Bonjour,
Non, que l'utilisateur puisse l'enregistrer en local.
Merci d'avance.
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 nov. 2009 à 14:39
alors avec CS4, il suffit d'utiliser la fonction FileReference.save() et le tour est joué.
Mais CS4 uniquement ... ça n'existe pas avec CS3.

Peg'
0
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
11 nov. 2009 à 14:42
Huhu, ça tombe bien, j'ai Cs4,
Du coup je vais rechercher FileReference.save() dans l'aide, voir comment ça fonctionne et essayer,
Si je n'arrive pas, je reviendrai ici même, et même si j'arrive, histoire de vous tenir au courant. :)
Car mon soucis pour le moment c'est que l'image enregistrée était blanche, donc je vais voir si j'ai le même problème avec FileReference.save().
Merci beaucoup :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
11 nov. 2009 à 14:56
Hmm, et bien finalement je reviens bien vite, j'ai un soucis,
J'ai cette erreur:
1061: Appel à la méthode save peut-être non définie, via la référence de type static Class.


Or, au début de mon document j'ai bien importé les packages:
import flash.net.*;


Est-ce que ce sont d'autres packages que je dois importer ?
Par avance, je te remercie.
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 nov. 2009 à 15:17
il faut instantier un objet fileRéférence avant d'utiliser la méthode :

var saveFile:FileReference = new FileReference();
saveFile.save(monByteArray, "nomduFichier.jpg");

Peg'
0
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
11 nov. 2009 à 15:32
Ok, merci, je n'ai plus d'erreurs !
Par contre, j'ai le même soucis, l'image enregistrée est blanche.
J'imagine donc que le soucis vient de mon ByteArray.

Voici le code où je définis mon ByteArray
	addChild (Clip_180);
Clip_180.visible = true;
var jpg_180:BitmapData = new BitmapData (taille_defaut, taille_defaut);
jpg_180.draw(Clip_180);
var jpgStream_180:ByteArray = jpgEncoder.encode(jpg_180);


Clip_180 est un MovieClip dans lequel j'ai des uiloaders qui chargent des png.
Je suis perdu,
Merci pour ton aide Pégase.
0
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
12 nov. 2009 à 18:04
Salut, c'est encore moi, je continue mes petits tests.
J'ai essayé de récupéré les pixels d'une autre façon:
	var rect_100:Rectangle = new Rectangle (x_reduite, y_reduite, taille_reduite3, taille_reduite3);
var jpg_100:BitmapData = new BitmapData (x_reduite, y_reduite, false);
jpg_100.getPixels(rect_100);
var enregistrement_100:FileReference = new FileReference();
enregistrement_100.save(jpg_100, "essai.jpg")

De cette manière, au lieu d'enregistrer une image toute blanche, il m'enregistre un fichier de 0 octets... donc même pas une image :/
Je continue à chercher de mon côté mais si quelqu'un a une idée je suis toujours preneur :)
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
12 nov. 2009 à 18:51
si tu lis la doc de "save", tu vois que tu peux enregistrer un ByteArray et pas une image directement.

Peg'
0
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
12 nov. 2009 à 18:53
Salut,
Oui j'ai lu, mais cette ligne:
jpg_100.getPixels(rect_100);
C'est pas justement pour créer un ByteArray ?
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
12 nov. 2009 à 20:16
si, mais ton ByteArray c'est rien de plus qu'un alignement de pixels sans autre support. L'enregistrer en fichier ne sert à rien sans l'avoir passé à la moulinette de l'encodage avant.

Peg'
0
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
12 nov. 2009 à 20:36
Ah ok, merci !
Du coup je dois écrire ça j'imagine (?) :
	var rect_100:Rectangle = new Rectangle (x_reduite, y_reduite, taille_reduite3, taille_reduite3);
var jpg_100:BitmapData = new BitmapData (x_reduite, y_reduite);
jpg_100.getPixels(rect_100);
var jpgStream_100:ByteArray = jpgEncoder.encode(jpg_100);

var enregistrement_100:FileReference = new FileReference();
enregistrement_100.save(jpgStream_100, "essai.jpg")

Du coup, effectivement, j'enregistre une image, seulement celle-ci est toute blanche.

D'ailleurs quand dans ma scène j'écris ceci:
	var loader:Loader = new Loader();
addChild(loader);
loader.loadBytes(jpgStream_100);

Ce loader affiche un rectangle blanc, preuve que je n'arrive pas à récupérer les pixels dans mon ByteArray jpgStream_100 :/

Désolé d'avoir du mal et d'autant vous solliciter, mais je n'y arrive vraiment pas.
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
12 nov. 2009 à 20:45
ça dépend de ton jpgEncode ...
Qu'est-ce que tu dois lui envoyer en encodage et lui qu'est-ce qu'il doit te renvoyer ?

Utiliser une fonction sans connaitre les paramètres d'entrée et de sortie ne sert pas à grand choses.

Peg'
0
Kangouroops Messages postés 21 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 15 mars 2010
12 nov. 2009 à 21:22
Et bien:
encode () method
public function encode(image:BitmapData):ByteArray

Created a JPEG image from the specified BitmapData
Parameters
image:BitmapData — The BitmapData that will be converted into the JPEG format.

Returns
ByteArray — a ByteArray representing the JPEG encoded image data.


Donc lorsque j'écris:
	var rect_100:Rectangle = new Rectangle (x_reduite, y_reduite, taille_reduite3, taille_reduite3);
var jpg_100:BitmapData = new BitmapData (x_reduite, y_reduite);
var bytes_100:ByteArray = jpg_100.getPixels(rect_100);
var bd_100:BitmapData = new BitmapData(x_reduite, y_reduite);
bd_100.setPixels(rect_100, bytes_100);
var jpgStream_100:ByteArray = jpgEncoder.encode(bd_100);

var enregistrement_100:FileReference = new FileReference();
enregistrement_100.save(jpgStream_100, "essai.jpg")


Donc à priori, ça devrait être bon, ou alors je passe à côté de quelque chose,
Mais je ne vois pas ce qui cloche :/
0
Rejoignez-nous