Формат EXIF
а вот так я вытащил оригинальную дату и в придачу другие теги, если count/count2(размер значения) больше 4, то value/value2 - это смещение от начала TIFF заголовка до значения, иначе value/value2 - это и есть значение
private static void readExif(RandomAccessFile raf, int offset) throws IOException{
raf.seek(12+offset);
short entries = raf.readShort();
System.out.println(String.format("IFD entries = %d", entries));
for(short i=0; i<entries; i++){
short tag = raf.readShort();
short type = raf.readShort();
int count = raf.readInt();
int offsetOrValue = raf.readInt();
System.out.println(String.format("tag = %x type = %x count = %d offsetOrvalue = %d", tag, type, count, offsetOrValue));
long currPointer = raf.getFilePointer();
if(tag==-30871){
raf.seek(12+offsetOrValue);
short entries2 = raf.readShort();
for(short j=0; j<entries2; j++){
short tag2 = raf.readShort();
short type2 = raf.readShort();
int count2 = raf.readInt();
int offsetOrValue2 = raf.readInt();
System.out.println(String.format("tag = %x type = %d count = %d offsetOrvalue = %d", tag2, type2, count2, offsetOrValue2));
long currPointer2 = raf.getFilePointer();
if(tag2==-28669){
raf.seek(12+offsetOrValue2);
byte[] bb = new byte[count2];
raf.read(bb);
System.out.println("DateTimeOriginal = "+new String(bb));
raf.seek(currPointer2);
}
}
raf.seek(currPointer);
}
}
int nextOffset = raf.readInt();
if(nextOffset>0)
readExif(raf, nextOffset);
}
public static void main(String args[]) {
try {
RandomAccessFile raf = new RandomAccessFile(new File("D:\\Archive\\MyPhotosAndVideos\\IMG_20140920_130624.jpg"), "r");
raf.seek(12);
raf.readShort();
raf.readShort();
readExif(raf, raf.readInt());
raf.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}