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.
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;
}
10 octobre 2007
DisplayObject AS3
Un article clair pour comprendre en douceur les DisplayObjects et DisplayObjectContainers de l'actionscript3