14

我想使用 Java 代码从本地系统中的图像文件中获取元数据

在附图中,您可以看到我想从 java 代码中提取的所需数据。

在此处输入图像描述

我编写了以下代码,似乎没有提取“详细信息”选项卡中提到的数据。以下代码的输出是,这不是我要找的。

Started .. 
Format name: javax_imageio_jpeg_image_1.0
Format name: javax_imageio_1.0

请给我你的想法。谢谢

try {
            ImageInputStream inStream = ImageIO.createImageInputStream(new File("D:\\codeTest\\arun.jpg"));
            Iterator<ImageReader> imgItr = ImageIO.getImageReaders(inStream);

            while (imgItr.hasNext()) {
                ImageReader reader = imgItr.next();
                reader.setInput(inStream, true);
                IIOMetadata  metadata = reader.getImageMetadata(0);

                String[] names = metadata.getMetadataFormatNames();
                int length = names.length;
                for (int i = 0; i < length; i++) {
                    System.out.println( "Format name: " + names[ i ] );
                }  
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
4

3 回答 3

16

使用 Java Core API没有简单的方法可以做到这一点。您必须解析图像的元数据树,并解释正确的 EXIF 标签。相反,您可以从具有 EXIF 解析功能的现有库中获取所需的代码,并在您的库中使用它。例如,我使用了Imagejavaxt,它提供了一种非常有用的方法来从图像中提取 GPS 元数据。它很简单:

javaxt.io.Image image = new javaxt.io.Image("D:\\codeTest\\arun.jpg");
double[] gps = image.getGPSCoordinate();

另外,javaxt.io.Image没有外部依赖项,因此如果您不想在整个库上添加依赖项,则可以使用该特定类。

于 2012-08-24T19:03:03.443 回答
9

我建议您阅读图像的 EXIF 标头,然后解析标签以查找 GPS 信息。在 Java 中有一个很棒的库(称为元数据提取器)用于提取和解析 EXIF 标头。请在此处查看此库的入门。

[GPS]完成本教程中的前 2 个步骤后,查找以( [GPS] GPS Longitude, [GPS] GPS Latitude, ...)开头的标签。

于 2012-08-24T18:44:02.880 回答
0

基于@dan-d 的回答,这是我的代码(kotlin)

private fun readGps(file: String): Optional<GeoLocation> {
    // Read all metadata from the image

    // Read all metadata from the image
    val metadata: Metadata = ImageMetadataReader.readMetadata(File(file))
    // See whether it has GPS data
    val gpsDirectories = metadata.getDirectoriesOfType(
            GpsDirectory::class.java)
    for (gpsDirectory in gpsDirectories) {
        // Try to read out the location, making sure it's non-zero
        val geoLocation = gpsDirectory.geoLocation
        if (geoLocation != null && !geoLocation.isZero) {
            return Optional.of(geoLocation)
        }
    }
    return Optional.empty()
}
于 2020-03-27T03:14:44.167 回答