2012-04-15 29 views
3

我试图创建一个程序,从图像文件中提取元数据。到目前为止,我已经创建了一个打印所有元数据的程序,但我无法弄清楚如何指定程序只打印某些东西(文件名,纬度,经度,访问日期)。在过去的四个小时里,我一直在努力想办法解决这个问题。这里是我的代码到目前为止.....元数据提取 - Java

主类:

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();  
    } 
} 

二等:

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; 
    } 
} 

错误:

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 
+0

真的很奇怪。它编译好吗?也许显式导入它:'import com.drew.metadata.exif.GpsDescriptor;'。也许干净/重建项目左右。不知道发生了什么;也许有些NetBeans的魔法不包括类路径中的东西... – Torious 2012-04-15 23:13:05

+0

你是天才。明确导入包已经工作。非常感谢! – user1311422 2012-04-16 13:41:41

回答

4

你可以得到Directory通过使用Metadata.getDirectory(Class)您的选择的子类。每种类型的Directory都有一个关联的Descriptor,您可以用它来解释Directory的原始数据。

例如,纬度可以从GpsDirectory使用获得GpsDescriptor这样的:

GpsDirectory gpsDir = (GpsDirectory) metadata.getFirstDirectoryOfType(GpsDirectory.class); 

if (gpsDir != null) { 
    GpsDescriptor gpsDesc = new GpsDescriptor(gpsDir); 
    System.out.println("Latitude: " + gpsDesc.getGpsLatitudeDescription()); 
} 

见的Descriptor特定类型您使用的是看它提供了获取数据,你的方法的文档想。

+0

谢谢Torious。这清除了一些事情。使用你的代码,我将它复制到我有的,但我得到一个轻微的错误。该错误位于代码的第二行,它表示metadata.get(GpsDirectory.class); – user1311422 2012-04-15 22:19:56

+0

我应该提到错误说“找不到符号” 符号:方法get(java.lang.Class ) 位置:com.drew.metadata.Metadata类型的可变元数据 – user1311422 2012-04-15 22:22:36

+0

噢,它应该说'metadata.getDirectory(...',对不起,我在编辑它的答案。 – Torious 2012-04-15 22:23:52