function Exif(){} Exif.read=function(file,func){ var reader=new FileReader(); reader.onload=function(e){ var mf=new MemoryFile(e.target.result,true); if(mf.readUInt16()!=0xFFD8) return func(false); // no JPEG file var baseOffset=0; while(!mf.eof()) if(mf.readUInt16()==0xFFE1 && mf.readUInt16()!=0 && mf.readUInt32()==0x45786966 && mf.readUInt16()==0){baseOffset=mf.tell();break;} // find Exif header if(baseOffset==0) return func(false); mf.setByteOrderBig(mf.readUInt16()==0x4d4d); mf.skip(2); var ifd0=mf.readUInt32(); var exif={}; exif['IFD0']=Exif.readBlock(mf,baseOffset,ifd0); if(exif['IFD0'][34665]) exif['EXIF']=Exif.readBlock(mf,baseOffset,exif['IFD0'][34665]); if(exif['IFD0'][34853]) exif['GPS']=Exif.readBlock(mf,baseOffset,exif['IFD0'][34853]); //console.log("EXIF: "+JSON.stringify(exif)); func(exif); }; reader.readAsArrayBuffer(file.slice(0,64*1024)); }; Exif.readBlock=function(mf,baseOffset,offset){ var tags={},numerator,denominator; mf.seek(baseOffset+offset); var num=mf.readUInt16(); //console.log("tag num "+num); for(var a=0;a4){ // is offset mf2=new MemoryFile(mf.toArrayBuffer(baseOffset+mf.readUInt32(),length*count),mf.getByteOrderBig()); }else{ // is value mf2=new MemoryFile(mf.toArrayBuffer(mf.tell(),4),mf.getByteOrderBig()); mf.skip(4); } //console.log("tag id="+id+" format="+format+" length="+length+" count="+count+" mf.size="+mf2.size); var values=[]; for(var b=0;b