Classe pngencoder (as3)

Soyez le premier à donner votre avis sur cette source.

Vue 7 118 fois - Téléchargée 228 fois

Description

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.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
Merci pour ton commentaire Mafassure.
Veux-tu que je rajoute la liste des classes utiles dans la description de la source ?
Messages postés
1058
Date d'inscription
jeudi 24 juillet 2003
Statut
Modérateur
Dernière intervention
14 février 2009

Bonjour,
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
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
Hello Top30,

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
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010

Une source très très intéresante, qui a en plus le mérite d'avoir été ajoutée par un membre honnête et généreux de nous la faire découvrir.

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...
Messages postés
764
Date d'inscription
lundi 21 juin 2004
Statut
Membre
Dernière intervention
5 février 2010

Je n'avais pas compris ce qui était voulu.
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
Afficher les 12 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.