元数据提取-Java
我正在尝试创建一个从图像文件中提取元数据的程序。到目前为止,我已经创建了一个打印所有元数据的程序,但是我不知道如何指定该程序只打印某些内容(文件名、纬度、经度、访问日期)。在过去的四个小时里,我一直在想办法解决这个问题。这是我到目前为止的代码 主要类别:元数据提取-Java,java,metadata,extraction,metadata-extractor,Java,Metadata,Extraction,Metadata Extractor,我正在尝试创建一个从图像文件中提取元数据的程序。到目前为止,我已经创建了一个打印所有元数据的程序,但是我不知道如何指定该程序只打印某些内容(文件名、纬度、经度、访问日期)。在过去的四个小时里,我一直在想办法解决这个问题。这是我到目前为止的代码 主要类别: package metadata; import com.drew.metadata.exif.*; import com.drew.metadata.iptc.*; import com.drew.metadata.jpeg.*; pub
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
您可以使用
Metadata.getDirectory(Class)
获取所选的目录
子类。每种类型的目录
都有一个相关的描述符
,可用于解释目录
的原始数据
例如,可以使用GpsDescriptor
从GpsDirectory
获取纬度,如下所示:
GpsDirectory gpsDir = (GpsDirectory) metadata.getFirstDirectoryOfType(GpsDirectory.class);
if (gpsDir != null) {
GpsDescriptor gpsDesc = new GpsDescriptor(gpsDir);
System.out.println("Latitude: " + gpsDesc.getGpsLatitudeDescription());
}
请参阅文档,了解用于查看获取所需数据的方法的特定类型的
描述符。谢谢。这让事情变得明朗了一点。使用你的代码,我把它复制到了我现有的代码中,但是我得到了一个小错误。错误出现在代码的第二行,其中表示metadata.get(GpsDirectory.class);我应该提到的错误是“找不到符号”符号:method get(java.lang.Class)位置:com.drew.metadata.MetadataOh类型的变量元数据,应该是metadata.getDirectory(…
,很抱歉。我在回答中编辑了它。线程“main”中出现异常java.lang.NoClassDefFoundError:metadata.ExtractTags.getLatitude(ExtractTags.java:44)at metadata.metadata.main(metadata.java:13)处的metadata/GpsDescriptor由以下原因引起:java.lang.ClassNotFoundException:java.net.URLClassLoader$1处的metadata.GpsDescriptor.run(URLClassLoader.java:366)at java.net.URLClassLoader$1.run(URLClassLoader.java:355)这可能是因为我从另一个类调用它。我有一个主类,它包含…..ExtractTags extractAllTags=new ExtractTags();extractAllTags.getLatitude()您必须添加所需的包导入:<代码>导入COM.Digul.ExvI.*;导入COM.DRAW.MID.ITCT.*;导入COM.DRAW.元数据。JPEG.*;。考虑使用IDE(如Eclipse),这将有助于此类事情。如果您仍然有更多的错误,请编辑您的主邮件以包含您现在的代码。真奇怪。很好?可能会显式导入:import com.draw.metadata.exif.GpsDescriptor;
。可能是清理/重建项目之类的。不确定发生了什么;可能是一些NetBeans魔术,不包括类路径上的内容……你这个天才。显式导入包已经成功了。非常感谢!