AIR Flex Actionscript

Un blog de plus dans la galaxie AIR flex

18 novembre 2007

Gestion de vidéos

Une appication AIR de plus, elle permet de  gérer ses contenus vidéos, sur la plateforme ooyala.

Ci joint une capture d'écran de ce que l'on peut faire avec. Image_3

Posté par StefonBlog à 01:54 - Application AIR - Commentaires [0] - Rétroliens [0] - Permalien [#]


16 novembre 2007

Exif actionscript

Bon, puisqu'en ce moment c'est la fête du byte reading, voilà la lecture des infos exif d'un fichier image  sans le charger

Les classes sont dispos chez Antti Kupilla

En plus des classes il y a une super explication et pour ceux que ça intéresse c'est très instructif.

Juste un petit truc au passage, je ne fais pas de flex pour le web, (on s'en fout :)), ok, ce qui me plait c'est surtout AIR, donc encore une fois (rapport à la lecture des  id3), il faut modifier l'accès au fichier pour utiliser ces classes avec AIR.

Ci dessous  la classe modifiée pour lire un fichier en local.

package
{
    import flash.display.*;
    import flash.events.*;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.net.*;
    import flash.utils.*;
    public class ExifReader extends Sprite {
        //    private var image:URLLoader = null;
        private var image:FileStream = new FileStream() ;
        private var _contentExif:String = null;
        public function ExifReader( path:String = "YOUR_DEFAULT_TEST_FILE" ) {                        

        ////   Connection distante
        /*
            var request:URLRequest = new URLRequest( path );
            image = new URLLoader();
            //image.dataFormat = DataFormat.BINARY;
            image.addEventListener( Event.COMPLETE, parse );
            image.load( request );
        */
        // Contenu local
            var sourceFile:File = new File();
            sourceFile.nativePath = path;
            image.openAsync(sourceFile, FileMode.READ);
            image.addEventListener( Event.COMPLETE, parse );
        }       

        public function parse( event:Event ):void {
            var contents:Array = null;
            var dump:Array = null;
            var ifd:Array = null;
            var data:ByteArray = new ByteArray();
            var exif:uint = 0;
            var interop:uint = 0;
            var length:uint = 0;
            var tiff:TIFF;

            image.readBytes( data, 0, 12 );

            if( !isJpeg( data ) || !hasExif( data ) ) {
                trace( "Not a JPEG containing EXIF data." );
                return;   
            }

            data.position = 4;
            length = data.readUnsignedShort();
            trace( "EXIF header length: " + length + " bytes" );

            image.readBytes( data, 0, length - 8 );

            if( data[0] == 73 ) {
                trace( "Intel format" );   
            } else {
                trace( "Motorola format" );
            }

            tiff = new TIFF( data );
            ifd = tiff.list();

            for( var i:int = 0; i < ifd.length; i++ ) {

                if( i == 0 ) {
                    trace( "Main image" );   
                } else if( i == 1 ) {
                    trace( "Thumbnail image" );   
                }

                contents = tiff.dump( ifd[i] );
                tiff.print( contents, TIFF.EXIF_TAGS );

                exif = 0;

                for( var t:int = 0; t < contents.length; t++ ) {
                    if( contents[t].getTag() == 34665 ) {
                        exif = contents[t].getValues()[0];
                    }
                }

                if( exif != 0 ) {
                    contents = tiff.dump( exif );
                    tiff.print( contents, TIFF.EXIF_TAGS );

                    interop = 0;

                    for( var s:int = 0; s < contents.length; s++ ) {
                        if( contents[s].getTag() == 40965 ) {
                            interop = contents[s].getValues()[0];
                        }   
                    }

                    if( interop != 0 ) {
                        contents = tiff.dump( interop );
                        tiff.print( contents, TIFF.INTEROP_TAGS );

                    }

                    dispatchEvent(new Event(Event.COMPLETE));                   
                }
            }
        }

        public function isJpeg( data:ByteArray ):Boolean {
            var jpeg:Boolean = false;

            if( data[0] == 255 && data[1] == 216 &&
                data[2] == 255 && data[3] == 225 ) {
                jpeg = true;   
            }
            return jpeg;
        }

        public function hasExif( data:ByteArray ):Boolean {
            var exif:Boolean = false;

            if( data[6] == 69 && data[7] == 120 &&
                data[8] == 105 && data[9] == 102 ) {
                exif = true;       
            }
            return exif;   
        }
    }
}

Si vous passez par  là et que vous connaissez des tutos sur la lecture d'infos dans  les fichiers  je suis preneur.

Enjoy !!

si je me souviens bien  il y a des petites fautes de frappes, je crois qu'il manque les s sur les import de flash.utils et des V majuscules sur les void qui ont géné flex pour la compile.

Posté par StefonBlog à 00:00 - ACTIONSCRIPT - Commentaires [0] - Rétroliens [0] - Permalien [#]

14 novembre 2007

RandomWin

Cette application vous  permet de prendre des  photos de  personnes, prendre leur nom, et enfin de faire  un tirage au sort  ... A utiliser  partout ou on en a besoin  :)

Et à télécharger sur CodeMoiUnMouton

Posté par StefonBlog à 16:56 - Application AIR - Commentaires [0] - Rétroliens [0] - Permalien [#]

13 novembre 2007

VideoChat avec Adium

Vu sur le blog de  Adium un plug in qui permet de  faire  des visioconferences jusqu'a 15 personnes, il serait dèv en  flash  ce qui ne gâche rien  :)

Bon je l'ai installé, maintenant il va falloir convaincre des gens pour le tester :)


Posté par StefonBlog à 19:19 - OSX - Commentaires [3] - Rétroliens [0] - Permalien [#]

Lire les ID3 d'un fichier

Lire les balises d'un mp3 peux sembler simple, c'est vrai si on accepte de lancer un objet sound.

Mais mon but étant simplement de récupérer les données pour les afficher, je ne trouvais pas très propre de  lancer  le son en arrière plan avec un volume à zéro le temps de récupérer les infos.

Heureusement Mr Ben Stucki nous a concoté un super tutoriel sur la lecture d'un fichier binaire et  la récupération des tags sur un fichier mp3

http://labs.adobe.com/wiki/index.php/AIR:Articles:Working_with_Binary_Data#Reading_binary_data

L'un des principaux problèmes de ce tuto pour les maceux, c'est l'utilisation de browse .... :( un jour peut être.
Enfin pour ça  il suffit de déterminer soit même le chemin du fichier que l'on souhaite lire.
Pour ça je donne  le path du fichier comme argument de la fonction.
Un autre  petit souci c'est que  l'exemple considère que  les fichiers sont bien tagés ce qui malheureusement  n'est pas toujours le cas, j'ai donc ajouté (en rouge )un test try ... catch pour eviter l'erreur 2030.
Et modifié (en vert) la manière de récupérer les infos notamment parce que sur certains  mp3 le titre n'est pas dans TIT2 mais TT2, une question de version je crois.

Le code original et les autres fonctions nécéssaires sont disponibles via le lien précédent.
SongTitle, SongAlbum, SongArtiste sont les noms de  mes champs textes ou variables à vous de les adapter au votre.

            private function loadLocalID3( pathDuFichier:String ):void {
                var file:File = new File();
                file.nativePath = pathDuFichier;
                var bytes:FileStream = new FileStream();
                bytes.open(file, FileMode.READ);

                // read in sequence
                var tagId:String = bytes.readUTFBytes(3);
                var majorVersion:Number = bytes.readByte();
                var minorVersion:Number = bytes.readByte();
                var flags:int = bytes.readByte();
                var tagSize:uint = convertSynchsafe(bytes.readUnsignedInt())

                trace("id: " + tagId);
                if(flags==0) {
                    //frames
                    while(bytes.position < tagSize) {
                        var id:String = bytes.readUTFBytes(4);
                        var size:uint = bytes.readUnsignedInt();
                        var flags1:int = bytes.readByte();
                        var flags2:int = bytes.readByte();
                        if(id!="") { trace(id); }

                        if(id.charAt(0)=="T") {   
                        try{
                            var encodingFlag:int = bytes.readByte();
                            var text:String = bytes.readUTFBytes(size-1);       
                            if(id == "TIT2"){   
                                SongTitle.text = text;
                            }
                            if(id == "TT2"){   
                                SongTitle.text = text;
                            }
                            if(id == "TPE1"){
                                SongArtist.text = text;
                            }
                            if(id == "TALB"){
                                SongAlbum = text;   
                            }

                        } catch(error:EOFError){
                            trace (error.message);
                        }
   

                        } else if(id == "APIC") {
                            var start:int = bytes.position;
                            var textEncoding:int = bytes.readByte();
                            var mime:String = readISO(bytes);
                            var pictureType:int = bytes.readByte();
                            var description:String = readISO(bytes);
                            var stop:int = bytes.position;
                            var imageSize:int = size-(stop-start);
                            var image:ByteArray = new ByteArray();
                            bytes.readBytes(image,0,imageSize);
                            var loader:Loader = new Loader();
                            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
                            loader.loadBytes(image);
                        } else {
                            bytes.position += size;
                        }
                    }
                    SongTitle.text = SongTitle.text+' '+SongAlbum; // Ca c'est  perso j affiche le titre et  l album dans le même champs
                }
            }

La ou Mr Stucki fait très fort, c'est  sur son blog ou il propose de récupérer le contenu des balises ID3 d'un élément distant (ce post  à pratiquement deux ans :)), mais il fonctionne avec flex3 beta 2 donc pas de soucis.
Il faut  refaire  les opérations citées précédemment dans le code car il y a  le même type de problèmes sur les fichiers qui n'ont pas de tags ou pas les mêmes.

D'ici quelques temps, j'espère être moins chargé et  faire un tutoriel complet sur le sujet, il me faut aussi un vrai blog avec de l'affichage de code et un moteur de recherche parce que là  c'est n'importe quoi :)

Posté par StefonBlog à 15:34 - AIR - Commentaires [4] - Rétroliens [0] - Permalien [#]

11 novembre 2007

CoverFlow avec flex

Disponible sur  http://dougmccune.com/blog/2007/11/03/coverflow-flex-component/

Un composant FLex qui permet de simuler un cover Flow type OSX.

Il permet aussi très simplement de  charger  d'autre composant.
Je pense le tester dans la foulée et faire un petit compte rendu des problèmes rencontrés, notamment les problèmes de ralentissement du au nombre d'items.

Posté par StefonBlog à 14:18 - LINKS - Commentaires [0] - Rétroliens [0] - Permalien [#]

09 novembre 2007

Un autre bureau virtuel

Les bureaux virtuels  ce n'est pas trop mon truc, surement parce que un j'ai déja essayé mais  trop tôt on va dire, et du coup beaucoup de temps et d'énergie pour un résultat disons mitigé (super expérience et mauvais bilan :) ).
Et deux certainement  parce que si je retombe dedans  je vais y retourner.... 

Mais là il  a un petit lien avec le jouet du moment (AIR), vous devez connaitre www.yourminis.com,  cette appli AIR qui lance pleins de widgets pour faire que des trucs inutiles ... l'heure, youtube, ebay enfin le web 2 en gros :). Attention l'appli est bien en elle même, c'est le contenu des widgets qui ne me convient  pas...

Et bien  ils  ont aussi fait un bureau virtuel que  j'ai trouvé bien sympathique et abouti, et surtout une belle démo de flex, il y a énormément de modules disponibles, tous avec des fonctionnalités particulières, bref beaucoup de travail.

Image_2
le site web

Posté par StefonBlog à 01:35 - LINKS - Commentaires [0] - Rétroliens [0] - Permalien [#]

08 novembre 2007

AS3 le replace du pauvre :)

Pour avoir un bel affichage alors que je  lis des noms de fichiers je voulais remplacer les _ par des espaces, simple et efficace à la fois  non  ?

alors  je cherche dans la doc et effectivement  il y a  une méthode replace() dans la classe String... Parfait.

Je fais ma petite fonction et Ho!! la surprise,  il ne me remplace que le premier, je viens du monde php ou un ereg_replace sur une chaine de caractère remplace toute les occurrences trouvées.

Bon la soluce n'est  pas  très compliquée c'est sur, il faut utiliser les expressions régulières

            private function showTitle(item:Object):String{
                var itemString:String = item.title;
                var pattern:RegExp = /_/g; // le g pour spécifier que l'on veut remplacer  toutes les occurrences :)

                itemString = itemString.replace(pattern," ");
                trace ('itemString '+itemString);
                return itemString;
            }

Posté par StefonBlog à 18:57 - ACTIONSCRIPT - Commentaires [0] - Rétroliens [0] - Permalien [#]

Flash player 9 update mieux vaut tard que jamais

Pour ceux qui comme moi seraient passé à coté, il y a une nouvelle version du flash player la   9.0.98.0 que l'on peut télécharger sur el lab d'adobe.

http://labs.adobe.com/downloads/flashplayer9.html

Posté par StefonBlog à 13:51 - GENERAL - Commentaires [0] - Rétroliens [0] - Permalien [#]

07 novembre 2007

Diagramme de Gant avec un dataGrid

Vu sur le oueb, pour ceux que ça intéresse, comment faire  un diagramme de gant avec un datagrid

http://www.cynergysystems.com/blogs/page/andrewtrice?entry=gantt_charts_in_flex_datagrids

Posté par StefonBlog à 12:32 - LINKS - Commentaires [1] - Rétroliens [0] - Permalien [#]
« Accueil  1  2  3  4  5   Page suivante »