title: Metadata Extraction - Java
body: <p>I'm trying to create a program that extracts the metadata from an image file. So far, I've managed to create a program that prints out all the metadata, but I can't figure out how to specify the program to print out only certain things (File name, latitude, longitude, date accessed). I've been trying to get my head around it for the past four hours. Here is the code I have so far.....</p>
  
  <p>Main Class:</p>
  
  <pre><code>package metadata;
  import com.drew.metadata.exif.*; 
  import com.drew.metadata.iptc.*; 
  import com.drew.metadata.jpeg.*;
  public class MetaData {
  
      public static void main(String[] args) {
  
          ExtractTags extractAllTags = new ExtractTags();
  
          //extractAllTags.getTags();
          System.out.println("\n\n\n Has this ");
          extractAllTags.getLatitude();     
      }
  }
  </code></pre>
  
  <p>Second Class:</p>
  
  <pre><code>package metadata;
  
  import com.drew.imaging.ImageMetadataReader;
  import com.drew.imaging.ImageProcessingException;
  import com.drew.metadata.Directory;
  import com.drew.metadata.Metadata;
  import com.drew.metadata.Tag;
  import com.drew.metadata.exif.GpsDirectory;
  import java.io.File;
  import java.io.IOException;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import com.drew.metadata.exif.*; 
  import com.drew.metadata.iptc.*; 
  import com.drew.metadata.jpeg.*;
  
  public class ExtractTags {
  
      String allTags;
      String latitude;
      File jpegFile = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\HTC Desire.jpg");
  
      public String getTags() {
  
          try {
              Metadata metadata = ImageMetadataReader.readMetadata(jpegFile);
  
              for (Directory directory : metadata.getDirectories()) {
                  for (Tag allTags : directory.getTags()) {
  
                      System.out.println(allTags);
                  }
              }
          } catch (ImageProcessingException ex) {
              Logger.getLogger(MetaData.class.getName()).log(Level.SEVERE, null, ex);
          } catch (IOException ex) {
              Logger.getLogger(MetaData.class.getName()).log(Level.SEVERE, null, ex);
          }
          return allTags;
      }
  
      public String getLatitude() {
          try {
              Metadata metadata = ImageMetadataReader.readMetadata(jpegFile);
              if (metadata.containsDirectory(GpsDirectory.class)) {
                  GpsDirectory gpsDir = (GpsDirectory) metadata.getDirectory(GpsDirectory.class);
                  GpsDescriptor gpsDesc = new GpsDescriptor(gpsDir);
                  System.out.println("Latitude: " + gpsDesc.getGpsLatitudeDescription());
              }
          } catch (ImageProcessingException ex) {
              Logger.getLogger(ExtractTags.class.getName()).log(Level.SEVERE, null, ex);
              System.out.println("Error 1");
          } catch (IOException ex) {
              Logger.getLogger(ExtractTags.class.getName()).log(Level.SEVERE, null, ex);
              System.out.println("Error 2");
          }
  
          return latitude;
      }
  }
  </code></pre>
  
  <p>Errors:</p>
  
  <pre><code>Exception in thread "main" java.lang.NoClassDefFoundError: metadata/GpsDescriptor
      at metadata.ExtractTags.getLatitude(ExtractTags.java:47)
      at metadata.MetaData.main(MetaData.java:13)
  Caused by: java.lang.ClassNotFoundException: metadata.GpsDescriptor
      at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
      at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
      ... 2 more
  </code></pre>