我想使用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();
}
答案 0 :(得分:10)
使用Java Core API没有 easy 方法。您必须解析图像的元数据树,并解释正确的EXIF标记。相反,您可以从具有EXIF解析功能的现有库中获取所需的代码,并在您的库中使用它。例如,我使用了Image
javaxt
类,它提供了一种从图像中提取GPS元数据的非常有用的方法。它很简单:
javaxt.io.Image image = new javaxt.io.Image("D:\\codeTest\\arun.jpg");
double[] gps = image.getGPSCoordinate();
另外,javaxt.io.Image
没有外部依赖项,因此如果您不想在整个库中添加依赖项,则可以使用该特定类。
答案 1 :(得分:7)
我建议您阅读图像的EXIF标题,然后解析标签以查找GPS信息。在Java中,有一个很棒的库(称为元数据提取器),用于提取和解析EXIF头。请参阅此库的使用入门here。
完成本教程中的前两个步骤后,请查找以[GPS]
([GPS] GPS Longitude
,[GPS] GPS Latitude
,...)开头的标记。
答案 2 :(得分: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()
}