You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用IIOMetadata提取JPEG图片中的GPS元数据

问题根因与解决方法

根因分析

JDK内置的com.sun.imageio.plugins.jpeg.JPEGMetadata实现不会主动解析APP1段(对应你输出中MarkerTag=225的unknown节点) 内的EXIF/GPS数据,只会把整个段的原始字节存储在节点的userObject属性中。你当前的代码仅打印了节点的公开属性,没有提取这段原始字节做二次解析,因此无法获取GPS数据。

改造方案

步骤1:筛选EXIF数据段

在遍历javax_imageio_jpeg_image_1.0格式的节点树时,筛选出标记为225的unknown节点,提取原始字节:

// 在printChildren方法的属性遍历逻辑后添加以下代码
if ("unknown".equals(childName) && "225".equals(child.getAttribute("MarkerTag"))) {
    byte[] app1Data = (byte[]) child.getUserObject();
    // 校验是否为EXIF段
    if (app1Data.length >= 6 
        && app1Data[0] == 'E' && app1Data[1] == 'x' && app1Data[2] == 'i' && app1Data[3] == 'f'
        && app1Data[4] == 0 && app1Data[5] == 0) {
        // 此处添加EXIF/GPS解析逻辑
        parseExifData(app1Data);
    }
}

步骤2:自行解析EXIF结构

EXIF数据基于TIFF格式存储,解析逻辑遵循以下规则:

  • 第6-7字节为字节序标识:II代表小端序,MM代表大端序
  • 第8-11字节为第一个IFD(图像文件目录)的偏移量
  • 遍历IFD内的标签,找到标签ID为0x8825的GPS IFD指针,跳转到对应偏移位置即可解析所有GPS元数据
  • GPS常用标签对照:
    • 0x0001:纬度标识,值为N(北纬)或S(南纬)
    • 0x0002:纬度值,三个有理数分别对应度、分、秒
    • 0x0003:经度标识,值为E(东经)或W(西经)
    • 0x0004:经度值,三个有理数分别对应度、分、秒

内容的提问来源于stack exchange,提问作者MiguelMunoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:48:03