【问题标题】:In java how can I extract camera related information from an image?在java中如何从图像中提取相机相关信息?
【发布时间】:2011-11-01 08:21:21
【问题描述】:

我希望使用 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);     
}

【问题讨论】:

    标签: java macos metadata photo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • 真的很棒。用这些例子很容易实现,但我很难让它在我的照片上工作。我认为 Aperture 可能会添加比提取器可以处理的更多信息。我希望从这样的照片中提取尺寸和关键词:80.167.88.49/masters/test.html
      • @Peter Larsen 我添加了一些用于提取维度和关键字的示例代码。我在您的示例图片上对其进行了测试,它对我有用。如果您需要更多帮助,请告诉我。
      • 我不知道发生了什么,但我在您测试过的同一张图片上不断收到以下错误。
      • @Peter-Larsen 如果您使用的是最新版本的库,请确保在您的类路径中同时拥有它的 jar 和它的依赖库。
      • ...依赖库:) xmpcore 是问题所在。非常感谢你的帮助。现在一切都按预期工作。你帮了大忙,谢谢
      【解决方案3】:

      您需要一个库来读取EXIF 元数据。在 blog post 上有一个如何使用 ImageIO 的示例。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 2011-03-08
        • 1970-01-01
        • 2011-02-28
        相关资源
        最近更新 更多