Magazine Internet

Exif actionscript

Publié le 15 novembre 2007 par Stef1

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.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Stef1 Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossiers Paperblog