【问题标题】:Metadata Extraction - Java元数据提取 - Java
【发布时间】:2012-04-15 21:40:42
【问题描述】:

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

主类:

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

【问题讨论】:

  • 真的很奇怪。它编译好了吗?也许明确地导入它:import com.drew.metadata.exif.GpsDescriptor;。也许清理/重建项目左右。不知道发生了什么;可能是一些 NetBeans 的魔法,不包括类路径中的东西......
  • 你这个天才。显式导入包是有效的。非常感谢!

标签: java metadata extraction metadata-extractor


【解决方案1】:

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

例如,可以使用GpsDescriptorGpsDirectory 获取纬度,如下所示:

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

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

请参阅您正在使用的特定类型的 Descriptor 的文档,以查看它提供的用于获取所需数据的方法。

【讨论】:

  • 谢谢托里奥斯。这让事情有点清楚了。使用您的代码,我将其复制到我拥有的代码中,但出现了一个小错误。错误出现在代码的第二行,它显示 metadata.get(GpsDirectory.class);
  • 我应该提到错误说“找不到符号”符号:方法 get(java.lang.Class) 位置:com.drew 类型的变量元数据.metadata.元数据
  • 哦,应该是metadata.getDirectory(...,抱歉。我在答案中对其进行了编辑。
  • 线程“main”中的异常 java.lang.NoClassDefFoundError: metadata/GpsDescriptor at metadata.ExtractTags.getLatitude(ExtractTags.java:44) at metadata.MetaData.main(MetaData.java:13) 引起作者:java.lang.ClassNotFoundException: metadata.GpsDescriptor at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 这可能是由于事实我从另一个班级打电话给它。我有一个主类,其中包含..... ExtractTags extractAllTags = new ExtractTags(); extractAllTags.getLatitude();
  • 您必须添加所需的包导入:import com.drew.metadata.exif.*; import com.drew.metadata.iptc.*; import com.drew.metadata.jpeg.*;。考虑使用诸如 Eclipse 之类的 IDE,这将有助于解决此类问题。如果您仍然遇到更多错误,请编辑您的主要帖子以包含您现在拥有的代码。
猜你喜欢
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多