Bonjour,
Ayant effectué plusieurs recherche sur le net et constatant que la réponse ne se trouvait pas sur Flashkod je décide donc de poster une source servant principalement de ressource.
La classe mise à disposition ici est un algorithme de conversion png vous permettant en autre d'exporter vos images via la classe FileReference en fichier png.
Attention : Je ne suis en aucun cas l'auteur de cette classe.
Le but de cette source n'est autre que de partager une classe que j'ai découverte sur le net et qui semble être très utile.
Lien vers le site où j'ai trouvé la classe :
http://www.kaourantin.net/2005/10/png-encoder-in-as3.html
Auteur du billet : Tinic Uro
Langage : ActionScript 3
Version : FlashPlayer 9, AIR 1.0
Pour l'exemple ci-dessous
Langage : ActionScript 3
Version : FlashPlayer 10, AIR 1.5 (dût à l'utilisation de la méthode "save" de la classe "FileReference")
Source / Exemple :
La source de la classe se trouve dans le fichier zip.
Voici néanmoins un exemple d'utilisation de cette classe.
import flash.net.FileReference;
//Pensez à importer votre classe PNGEncoder en fonction du package dans lequel elle se trouve
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());
}
addChild(new Bitmap(myPicture));
//Génération de l'image et invite d'enregistrement client
var myByteArray:ByteArray = PNGEncoder.encode(myPicture);
var myFileReference:FileReference = new FileReference();
myFileReference.save(myByteArray,"myPicture.png");
Conclusion :
La classe comporte quelques corrections (très mineur), notamment la résolution de l'exception résultant de la fonction "shr" (non présente dans cette version) dont la réponse figure parmi les commentaires du site source.
Je précise à nouveau ne pas être l'auteur de cette classe.
Les éventuels remerciement ne me reviennent donc pas.
15 févr. 2009 à 20:32
Veux-tu que je rajoute la liste des classes utiles dans la description de la source ?
14 févr. 2009 à 10:28
je me permet d'ajouter des informations sur la disponibilité de classe.
CORLIB http://code.google.com/p/as3corelib/
avec d'autres classes toutes aussi pratique.
- pngEncoder
- jpgENcoder
- md5
- sha1
- ....
notament les class crypto md5 et sha1 c'est du concret du trés utile
Library a découvrir d'urgence
12 févr. 2009 à 11:22
Merci pour ton commentaire.
La source a en effet le mérite d'être utile et surtout en Action Script 3, cela manque terriblement sur Flashkod.
D'autant que la classe permets de comprendre comment est constituer un fichier png ;)
Et avec la classe ByteArray il est d'ailleurs possible de créer ces propres fichiers !
Blacknight
11 févr. 2009 à 19:05
Etant un peu (trop) méticuleux, j'ai cherché à comprendre comment celle-ci fonctionnait. Chose que j'ai fait en la retranscrivant plus proprement.
Je souhaitais donc aussi, t'en faire profiter. La voici...
//////////////////////////////////////////////////////
/**
* hope®2009-HopeMultimedias.com[Top30]
* http://www.hopeMultimedias.com
*
* Original code and idea: Tinic Uro
* http://www.kaourantin.net/2005/10/png-encoder-in-as3.html
**/
package hm.apogee.codec
{
import flash.display.*;
import flash.utils.*;
import flash.net.*;
import flash.geom.*;
//
/**
* Classe chargée de générer et sauvegarder des fichiers au format PNG.
* Les fichiers étant des instances "ByteArray" remplis selon les normes PNG.
*/
public class PNGCodec
{
/**
* Créer un fichier PNG de l'objet passé, puis ouvre une boîte de dialogue
* pour son enregistrement sur le disque dur de l'utilisateur.
*
* @param source L'objet à dessiner puis à sauvegarder.
* @param name Le nom du fichier sans l'extention ".png".
* @return L'objet "FileReference" ayant ouvert la boite de dialogue.
*/
public static function save( source:IBitmapDrawable, name:String )
:FileReference {
var fileRef :FileReference = new FileReference() ;
fileRef.save( PNGCodec.draw(source), name+".png" );
//
return fileRef ;
}
//
/**
* Retourne un fichier PNG de l'objet passé.
*
* @param source L'objet à dessiner.
* @return Un ByteArray au format PNG.
*/
public static function draw( source:IBitmapDrawable )
:ByteArray {
PNGCodec.computeSpectrum() ;
//
var png :ByteArray, IHDR:ByteArray, IDAT:ByteArray ;
var img :BitmapData = PNGCodec.bitmapData(source) ;
var bkg :Boolean = !img.transparent ;
//
png= new ByteArray();
png.writeUnsignedInt(0x89504E47);
png.writeUnsignedInt(0x0D0A1A0A);
//
IHDR= new ByteArray();
IHDR.writeInt(img.width);
IHDR.writeInt(img.height);
IHDR.writeUnsignedInt(0x08060000);
IHDR.writeByte(0);
PNGCodec._chunck(png,0x49484452,IHDR);
IDAT = new ByteArray();
var w :int = img.width ;
var h :int = img.height ;
var x :int = -1 ;
var y :int = -1 ;
var p :uint = 0 ;
for ( y=0 ; y<h ; y++ ){
IDAT.writeByte(0);
for ( x=0 ; x<w ; x++ )
{
if ( bkg ){
p = img.getPixel(x,y);
IDAT.writeUnsignedInt( (p & 0xFFFFFF) << 8 | 0xFF );
//
} else {
p = img.getPixel32(x,y);
IDAT.writeUnsignedInt( (p&0xFFFFFF)<<8|p>>>24 );
}
}
}
IDAT.compress();
PNGCodec._chunck( png, 0x49444154, IDAT );
PNGCodec._chunck( png, 0x49454E44, null );
//
return png;
}
//
/**
* Transforme l'argument passé en "BitmapData".
*
* @param source L'objet source à dessiner.
* @return Un BitmapData du dessin source.
*/
public static function bitmapData( source:IBitmapDrawable )
:BitmapData {
if ( source is BitmapData ) return BitmapData(source) ;
if ( source is Bitmap ) return Bitmap(source).bitmapData ;
//
var c :*= DisplayObject(source).opaqueBackground ;
var w :Number= DisplayObject(source).width ;
var h :Number= DisplayObject(source).height ;
var t :Boolean = (c==null) ;
if( t ) c= 0xFF000000 ;
var data :BitmapData= new BitmapData(w,h,t,c) ;
data.draw(source) ;
return data ;
}
//
/**
* Remplissage initial du spectre CCR. Ne s'exécute qu'une seule et unique fois.
**/
public static function computeSpectrum()
:void {
var a :Array = PNGCodec._spectrum ;
if ( a.length>0 ) return ;
//
var c :uint = 0 ;
var x :uint = 0 ;
var y :uint = 0 ;
for ( x = 0; x < 256; x++ )
{
c = x ;
for ( y = 0; y < 8; y++ )
{
if( c&1 ) c= 0xEDB88320^(c>>>1) ;
else c = (c>>>1) ;
}
a[x] = c ;
}
}
//
/** Tableau du spectre CCR **/
private static var _spectrum :Array = [] ;
//
/** Transforme le byteArray "png" selon les paramètres passés **/
private static function _chunck( png:ByteArray, type:uint, data:ByteArray )
:void {
var a :Array = PNGCodec._spectrum ;
png.writeUnsignedInt( data==null? 0 : data.length );
var p1 :uint = png.position ;
png.writeUnsignedInt(type);
if( data!=null ) png.writeBytes(data);
var p2 :uint = png.position;
png.position = p1 ;
var i :uint = 0 ;
var j :uint = 0 ;
var n :int = (p2 - p1) ;
var c :uint = 0xFFFFFFFF ;
for ( i = 0; i < n; i++)
{
j = ( c ^ png.readUnsignedByte()) & 0xFF ;
c = a[j]^(c>>>8) ;
}
c^= 0xFFFFFFFF ;
png.position = p2 ;
png.writeUnsignedInt(c);
}
}
}
//////////////////////////////////////////////////////
En passant j'ai mis 9.. et oui le 10 étant pour l'auteur ! Super sympa de ta part.
A plus...
6 févr. 2009 à 21:07
Suite à des éclaircissements de Blacknight, j'ai compris que vous vouliez en fait enregistrer les images dans le dossier même de l'application.
Or, ma source enregistre dans le dossier de stockage des données de l'application (appData/.../com.adobe.votreProjet pour windows et Bibliothèque>Préférences>com.adobe.votreProjet pour mac ; linux je sais pas :) ).
Je sélectionne en effet le dossier où enregistrer par :
var dossier:File = File.applicationStorageDirectory.resolvePath("enregistrees/");
Or, si vous voulez enregistrer dans le même dossier que le .app ou le .exe, c'est :
var dossier:File = File.applicationDirectory.resolvePath("enregistrees/");
(vous enregistrez ici dans un dossier "enregistrees", contenu dans le dossier qui contient le exe/app).
Voilà, voilà.
Pas sûr que ça vaille le coup de faire une source... A voir.
Bye
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.