begin process at 2010 03 22 03:21:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

ActionScripts

 > CLASSE PNGENCODER (AS3)

CLASSE PNGENCODER (AS3)


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :ActionScripts Classé sous :PNGEncoder, classe, generation png, image png, png Niveau :Débutant Date de création :05/02/2009 Date de mise à jour :05/02/2009 20:10:32 Vu / téléchargé :3 553 / 116

Auteur : Blacknight91titi

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 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

  • 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");
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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

05 février 2009 20:08:08 :
Ajout de la version d'ActionScript requise.
05 février 2009 20:10:32 :
Ajout de la version d'ActionScript requise

 Sources du même auteur

Source avec Zip Source avec une capture GESTIONNAIRE KEYBOARDEVENT (TOUCHE MULTIPLE)
Source avec Zip Source avec une capture EDITEUR DE DESSIN + ENREGISTREMENT
Source avec Zip Source avec une capture DÉPLACEMENT DE PERSO STYLE JEUX DE STRATEGIE
Source avec Zip Source avec une capture FONDU DE COULEURS
Source avec Zip Source avec une capture BALLET DE LIGNES + FONDU DE COULEUR

 Sources de la même categorie

Source avec Zip Source avec une capture LANCER UNE GALERIE LIGHTBOX À PARTIR D'UN FLASH par beladom
Source avec Zip SUPER TWEEN PACKAGE par Acidchlorhydrik
Source avec Zip NAVIGATION DANS UN FICHIER XML par inaden
Source avec Zip Source avec une capture TWSCROLLBAR, UNE CLASSE DE SCROLLBAR SIMPLE ET PRATIQUE À UT... par Twinspirit
Source avec Zip Source avec une capture REBOND DE BALLON AVEC TWEEN par habibcode

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CLASSE AS3 MENU CONTEXTUEL par Orange73
Source avec Zip IMPORTSVG: UNE CLASSE QUI PERMET DE RETRACER DES SVG EN AS3 par Mansuz
Source avec Zip Source avec une capture GÉSTIONNAIRE DE CLASSE POUR LE TABLEAU NUMÉRIQUE INTERACTIF par barbidouille2
Source avec Zip Source avec une capture MENUS DÉROULANTS XML par Speedy321
UNE HORLOGE DONT ON PEUT FAIRE TOURNER LES AIGUILLES par buzhug35

Commentaires et avis

Commentaire de bali_balo le 05/02/2009 16:53:05

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....=]

Commentaire de bali_balo le 05/02/2009 16:56:34

Quoique c'est le client qui enregistre où il veut, mais bon, chui sur ya moyen ^^

bali_balo....=]

Commentaire de Blacknight91titi le 05/02/2009 20:03:21

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.

Commentaire de pegase31 le 06/02/2009 15:05:20 administrateur CS

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'

Commentaire de Blacknight91titi le 06/02/2009 15:34:01

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.

Commentaire de pegase31 le 06/02/2009 15:54:14 administrateur CS

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)

Commentaire de WhiteMagus le 06/02/2009 19:04:28

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

Commentaire de WhiteMagus le 06/02/2009 21:07:30

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

Commentaire de top30 le 11/02/2009 19:05:09 9/10

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...


Commentaire de Blacknight91titi le 12/02/2009 11:22:54

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

Commentaire de Mafassure le 14/02/2009 10:28:53 administrateur CS

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

Commentaire de Blacknight91titi le 15/02/2009 20:32:13

Merci pour ton commentaire Mafassure.
Veux-tu que je rajoute la liste des classes utiles dans la description de la source ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

classe et méthode... [ par upyboobs ] est ce que quelqu'un serait capable de m'éclaircir sur la différence entre les casses et les méthodes et les objets... qd utiliser quoi, pourquoi... e Integrer du PNG [ par zephilde ] Boujour tt le monde!J'ai besoin de charger dynamiquement des icones (donc *.ico) mais comme c'est impossible je me suis résolu a charger des images PN image PGN et lissage [ par odonnize ] Voila j'ai importé une image PNG dans flash. il s'agit en fait d'un texte sur fond transparent. j'ai décoché dans l'option de mon image l'effet "allow Pourquoi je ne vois pas les changements reflétés [ par jekif ] Salut,j'ai un problème un peu chiant. J'ai un fla qui ne fait que créer une instance d'une classe X , qui elle affiche une image sur la scène. Enfin j Pleins de petites questions d'un débutant....HELP PLEASE!! [ par juju2chaussette ] Salut à tous,Je sui en stage info et je débute en Flash, je dois à partir récupérer les données d'un fichier XML et les afficher dans mon doc Flash : Programmation réseau avec Flash [ par naq2 ] Bonjour,J'aimerai faire de la programmation réseau à travers Flash... mais la seule classe qui s'y apparente un peu à cela est la classe XMLSocket mai problème avec la classe XML [ par pomelo ] et bien j'utilise XML.load pour reprendre du XML évidemment mais je l'ai pas mit dans un setInterval mais plustôt dans une boucle fait en image flash Instance de movieclip dans une classe AS2 [ par Clemto ] bonjour les gensVoila, pour faire de la 3d, je trace donc des faces, mais il y a quelques bug sur la profondeur et l'affichage de ces faces. Je voudra Pb d'accès à un membre de classe AS2 [ par francisek ] Salut,Je commence en AS2 donc c'est peut être tout bête.Voilà l'énoncé de mon problème:J'ai créé une classe avec un membre XML. Dans le gestionnaire o creer une image png [ par okaneganai ] Bonjour.Est t'il possible via l'action script de transformer notre animation en png?Le but: j'ai créé une petite animation qui permet de dessiner, et


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales