Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从图像Java代码中获取GPS数据_Java_Image_Metadata_Jpeg - Fatal编程技术网

从图像Java代码中获取GPS数据

从图像Java代码中获取GPS数据,java,image,metadata,jpeg,Java,Image,Metadata,Jpeg,我希望使用Java代码从本地系统中的图像文件中获取元数据 在所附的图片中,您可以看到我希望从java代码中提取的所需数据 我写了下面的代码,似乎没有提取“详细信息”选项卡中提到的数据。下面代码的输出是,这不是我想要的 Started .. Format name: javax_imageio_jpeg_image_1.0 Format name: javax_imageio_1.0 请告诉我你的想法。谢谢 try { ImageInputStream inStrea

我希望使用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();
        }
试试看{
ImageInputStream inStream=ImageIO.createImageInputStream(新文件(“D:\\codeTest\\arun.jpg”);
迭代器imgItr=ImageIO.getImageReaders(流内);
while(imgItr.hasNext()){
ImageReader=imgItr.next();
reader.setInput(流内,真);
IIOMetadata元数据=reader.getImageMetadata(0);
字符串[]名称=元数据。getMetadataFormatNames();
int length=names.length;
for(int i=0;i
我建议您阅读图像的EXIF标题,然后解析标签以查找GPS信息。在Java中,有一个很棒的库(称为元数据提取器)用于提取和解析EXIF头。请参阅此库的入门指南

完成本教程中的前两个步骤后,查找以
[GPS]
开头的标记(
[GPS]GPS经度
[GPS]GPS纬度
,…)。

使用Java核心API没有简单的方法。您必须解析图像的元数据树,并解释正确的EXIF标记。相反,您可以使用EXIF解析功能从现有库中提取所需的代码,并在您的库中使用它。例如,我使用了类of,它提供了从图像中提取GPS元数据的非常有用的方法。这很简单:

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

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

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

private-fun-readGps(文件:String):可选{
//从映像中读取所有元数据
//从映像中读取所有元数据
val metadata:metadata=ImageMetadataReader.readMetadata(文件)
//看看是否有GPS数据
val gpsDirectories=metadata.getDirectoriesType(
GpsDirectory::class.java)
用于(GPS目录中的GPS目录){
//试着读出位置,确保它不是零
val geoLocation=gpsDirectory.geoLocation
if(geoLocation!=null&&!geoLocation.isZero){
返回可选的.of(地理位置)
}
}
返回可选的.empty()
}

您的代码在哪些方面不符合您的要求?请把你的问题说清楚。编辑我的问题。希望这能让你对我想要的东西有更多的了解:-)我的观点是javaxt更像是一个图像处理和应用操作。元数据提取器用于提取可能更适合的标题信息。
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()
}