import java.util.Iterator;
import java.io.InputStream;
import java.io.FileInputStream;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import org.w3c.dom.NodeList;
import com.drew.lang.Rational;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.exif.ExifReader;
import com.drew.metadata.exif.GpsDirectory;
public class ExifTest{
public static void main(String[] args) throws Exception{
InputStream is = new FileInputStream(args[0]);
Iterator it = ImageIO.getImageReadersByFormatName("jpeg");
ImageReader ir = (ImageReader)it.next();
ir.setInput(ImageIO.createImageInputStream(is), true, false);
IIOMetadata meta = ir.getImageMetadata(0);
double[] gps = getGpsInfo(meta);
if (gps != null){
System.out.println(
"latitude=" + gps[0] + " longitude=" + gps[1]);
}
}
public static double[] getGpsInfo(IIOMetadata meta){
IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(
meta.getNativeMetadataFormatName());
try{
NodeList nl = root.getElementsByTagName("unknown");
int nodes = nl.getLength();
for (int i=0; i < nodes; i++){
IIOMetadataNode node = (IIOMetadataNode)nl.item(i);
String val = node.getAttribute("MarkerTag");
if (val != null && val.equals("225")){
return getGpsInfo((byte[])node.getUserObject());
}
}
}
catch(MetadataException me){
me.printStackTrace();
}
return null;
}
public static double[] getGpsInfo(byte[] bytes)
throws MetadataException{
Metadata meta = new Metadata();
new ExifReader(bytes).extract(meta);
GpsDirectory dir = (GpsDirectory)
meta.getDirectory(GpsDirectory.class);
if (dir == null){
return null;
}
double lat = 0;
double lon = 0;
Rational[] rs;
String s;
if (dir.containsTag(dir.TAG_GPS_LATITUDE)){
rs = dir.getRationalArray(dir.TAG_GPS_LATITUDE);
lat = rs[0].doubleValue() +
(rs[1].doubleValue() / 60) +
(rs[2].doubleValue() / 3600);
}
if (dir.containsTag(dir.TAG_GPS_LONGITUDE)){
rs = dir.getRationalArray(dir.TAG_GPS_LONGITUDE);
lon = rs[0].doubleValue() +
(rs[1].doubleValue() / 60) +
(rs[2].doubleValue() / 3600);
}
if (dir.containsTag(dir.TAG_GPS_LATITUDE_REF)){
s = dir.getString(dir.TAG_GPS_LATITUDE_REF);
if (s.equals("S")){
lat *= -1;
}
}
if (dir.containsTag(dir.TAG_GPS_LONGITUDE_REF)){
s = dir.getString(dir.TAG_GPS_LONGITUDE_REF);
if (s.equals("W")){
lon *= -1;
}
}
return new double[]{ lat, lon };
}
}
|