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.