CLASSE PNGENCODER (AS3)

cs_bali_balo Messages postés 1378 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 1 novembre 2010 - 5 févr. 2009 à 16:53
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 - 15 févr. 2009 à 20:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/49183-classe-pngencoder-as3

Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
15 févr. 2009 à 20:32
Merci pour ton commentaire Mafassure.
Veux-tu que je rajoute la liste des classes utiles dans la description de la source ?
cs_Mafassure Messages postés 1058 Date d'inscription jeudi 24 juillet 2003 Statut Modérateur Dernière intervention 14 février 2009
14 févr. 2009 à 10:28
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
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
12 févr. 2009 à 11:22
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
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
11 févr. 2009 à 19:05
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...
WhiteMagus Messages postés 764 Date d'inscription lundi 21 juin 2004 Statut Membre Dernière intervention 5 février 2010
6 févr. 2009 à 21:07
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
WhiteMagus Messages postés 764 Date d'inscription lundi 21 juin 2004 Statut Membre Dernière intervention 5 février 2010
6 févr. 2009 à 19:04
Hello.

J'ai fait une petite source pour décrire l'enregistrement en local.

Vous la trouverez ici : http://www.anirniq.com/SauvegardeLocale.zip

Il y a dedans le .air, le.fla (avec tout le code sur la première frame) et le PNGEncoder.as.

Si quelqu'un a besoin du .as pour la démo, je pourrai lui passer (si vous bossez pas avec Flash) mais j'ai pas pensé à le mettre là :S

Sinon, source importante, quand même :) Merci de la poster là, Blacknight, je saurai où la retrouver.

Bye
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
6 févr. 2009 à 15:54
non, justement : dans AIR on n'a pas accès en écriture au répertoire de l'application. Il y a des restrictions à ce sujet (j'étudie ça justement).
Il y a justement pleins d'autres endroits où on peut écrire (par défaut) et même donner la possibilité d'ouvrir nue boîte de dialogue pour laisser le choix à l'utilisateur (avec le nom, en plus).

Peg
AIR c'est de la balle ... même sous flash (et pas flex)
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
6 févr. 2009 à 15:34
Dans le cas de l'utilisation de AIR pour ce code, la version 1.5 sera requise.
Bien que...

La classe peut également servir en local via AIR pour l'enregistrement de donnée (image PNG en l'occurrence) sur le disque (dans le répertoire d'installation de l'application).
Je ne connais cependant pas la méthode.
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
6 févr. 2009 à 15:05
Ce script fonctionne sous flash, il n'y a aucune fonction spécifique à AIR (ou alors j'ai pas bien vu).
Cette classe transforme un ByteArray en format compressé PNG et peut donc aussi être envoyé sur le serveur qui, lui, en fera ce que bon lui semble.

Peg'
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
5 févr. 2009 à 20:03
J'imagine que ce doit être possible oui.

Par contre, note qu'un message d'avertissement est ajouté sur la fenêtre d'enregistrement (sur Windows en tout cas) prévenant des risques de l'ouverture du fichier.

Plus d'information à propos de cette éventuelle "faille" sur la classe "FileReference" et sur la méthode "save".

Note : Je rajoute les informations que tu as rajouté dans la description. Merci à toi.
cs_bali_balo Messages postés 1378 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 1 novembre 2010 1
5 févr. 2009 à 16:56
Quoique c'est le client qui enregistre où il veut, mais bon, chui sur ya moyen ^^

bali_balo....=]
cs_bali_balo Messages postés 1378 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 1 novembre 2010 1
5 févr. 2009 à 16:53
Merci BlackNight de partager ce genre de source, c'est vrai qu'on est pas forcément obligé de présenter nos propre source.
Par contre j'aurais aimé que tu précises ceci :
Runtime Versions: Flash Player 10, AIR 1.5

Sinon ça ne marche pas... ( shame on me, j'ai toujours FP 9 au boulot :S )
Super source en tout cas !

C'est pas risqué ça de pouvoir écrire sur le poste client ?
Genre on demande d'enregistrer un faux fichier et en faite c'est un .bat qui se met à la racine du PC.
ET BOOOMM, formatage de toute les partitions du PC ;P

bali_balo....=]
Rejoignez-nous