在java中如何从图像中提取相机相关信息?

时间:2011-08-22 17:34:33

标签: java macos metadata photo

我希望使用Java从jpg中提取相机相关信息。我环顾四周,但一直无法找到问题的解决方案。我在我的Mac(OS X 10.7)上从Aperture导出我的照片,并希望使用文件信息中提供的Aperture数据。

有什么想法吗?

我希望从照片中提取尺寸和关键词:80.167.88.49/masters/test.html。目前,我在尝试使用元数据提取器时遇到异常。我不知道Aperture是否正在添加无法处理的信息,但它会在Aperture的所有照片上引发异常。

Exception in thread "main" java.lang.NoClassDefFoundError: com/adobe/xmp/XMPException
    at com.drew.imaging.jpeg.JpegMetadataReader.extractMetadataFromJpegSegmentReader(Unknown Source)
    at com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(Unknown Source)
    at com.drew.imaging.ImageMetadataReader.readMetadata(Unknown Source)
    at com.drew.imaging.ImageMetadataReader.readMetadata(Unknown Source)
    at ImageScaler.main(ImageScaler.java:141)
Caused by: java.lang.ClassNotFoundException: com.adobe.xmp.XMPException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 5 more

代码:

public static void main (String[] args){

    File image = new File("/Users/peterla/Desktop/P8214462.jpg");

    Metadata metadata = null;
    try {
    metadata = ImageMetadataReader.readMetadata(image);
    } catch (ImageProcessingException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }

    Directory directory;

    // Keywords
    directory = metadata.getDirectory(IptcDirectory.class);
    String keywords[] = directory.getStringArray(IptcDirectory.TAG_KEYWORDS);

    // Dimensions
    directory = metadata.getDirectory(JpegDirectory.class);     
    String height = directory.getString(JpegDirectory.TAG_JPEG_IMAGE_HEIGHT);
    String width = directory.getString(JpegDirectory.TAG_JPEG_IMAGE_WIDTH);     
}

3 个答案:

答案 0 :(得分:4)

您需要一个库来阅读EXIF元数据。有一个如何使用ImageIO在blog post上执行此操作的示例。

根据您的需要,您可能还需要考虑其他库。例如MetadataExtractorSanselan

答案 1 :(得分:4)

Metadata Extractor有一个简单的界面,可以从许多数字图像格式中读取几种类型的元数据。这包括jpeg图像中使用的EXIF元数据格式。该库具有良好的Javadoc样式documentation

进入库的主要入口点是ImageMetadataReader对象。

Getting Started页面有一个很好的介绍,包括如何从EXIF格式元数据中获取特定标记值的一个很好的示例。

更新:提取关键字和维度的示例

Directory directory;
// Keywords
directory = metadata.getDirectory(IptcDirectory.class);
String keywords[] = directory.getStringArray(IptcDirectory.TAG_KEYWORDS);

// Dimensions
directory = metadata.getDirectory(JpegDirectory.class);     
String height = directory.getString(JpegDirectory.TAG_JPEG_IMAGE_HEIGHT);
String width = directory.getString(JpegDirectory.TAG_JPEG_IMAGE_WIDTH);

<强>替代

替代方案包括内置的java ImageIO库和Sanselan

答案 2 :(得分:1)

jhead是一个JPEG EXIF标题处理工具,是另一种选择。