如何使用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
相关产品推荐
相关产品推荐

