2011-08-22 24 views
5

我正在寻找使用Java从jpg中提取相机相关信息。我环顾四周,但一直未能找到解决我的问题的方法。我在我的Mac(OS X 10.7)上从Aperture导出照片,并希望使用文件信息中提供的来自Aperture的数据。在java中,我如何从图像中提取相机相关的信息?

任何想法?

我期待从像这样的照片中提取尺寸和关键词: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);  
} 

回答

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库ImageIOSanselan

+0

这真的很棒。用例子很容易实现,但我很难让它在我的照片上工作。我认为Aperture可能会增加更多信息,而不是提取器可以处理的信息。我期待从这样的照片中提取维度和关键词:http://80.167.88.49/masters/test.html –

+0

@Peter Larsen我添加了一些用于提取维度和关键字的示例代码。我在你的示例图片上测试了它,它对我很有用。让我知道你是否需要更多帮助。 –

+0

我不知道发生了什么,但我一直在你测试过的相同图像上出现以下错误。 –

1

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

相关问题