AIR Flex Actionscript

Un blog de plus dans la galaxie AIR flex

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 [#]


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 [#]

10 octobre 2007

DisplayObject AS3

Un article clair pour  comprendre en douceur  les  DisplayObjects  et DisplayObjectContainers de l'actionscript3

http://www.actionscript.org/resources/articles/623/1/Working-With-Display-Objects-in-AS-30/Page1.html

Posté par StefonBlog à 15:16 - ACTIONSCRIPT - Commentaires [0] - Rétroliens [0] - Permalien [#]
« Accueil  1