Flutter无法从图片中读取GPS的 EXIF信息,但Windows的文件属性却显示经纬度
为什么Flutter/Dart无法从一个在Windows属性中清晰显示经纬度的图片中读取GPS EXIF数据?这是EXIF包的局限、图片选择器返回了被剥离的拷贝,还是图像中GPS标签的存储方式出现了问题?在Flutter中如何可靠地提取GPS的纬度和经度?应该使用不同的包,还是采用不同的导入方式?
如何调试Flutter实际接收到的EXIF数据
我正在构建一个Flutter应用,它会导入照片并使用Dart读取EXIF元数据。问题在于,同一张图片在Windows的文件属性中清楚地包含GPS数据,但我的Flutter应用却无法提取出经纬度。
import 'dart:developer' as dev;
import 'dart:io';
import 'package:native_exif/native_exif.dart';
class ExifService {
Future<void> extractMetadata(String filePath) async {
final file = File(filePath);
final exif = await Exif.fromPath(filePath);
final latLon = await exif.getLatLong();
print(latLon);
final lat = await exif.getAttribute('GPSLatitude');
final lon = await exif.getAttribute('GPSLongitude');
print('lat=$lat lon=$lon');
await exif.close();
}
}
我已在下列地方核对照片元数据:
Windows文件属性、手机照片详情/图库详情、带位置信息的Windows属性

两张都显示GPS的经纬度,因此文件中确实存在元数据。但在Flutter中,我的EXIF读取器返回:没有GPS标签、或为null、或坐标为0/0。我使用的代码如下:``
我也尝试手动解析GPS EXIF字符串,但应用仍然拿不到坐标。我已核对的情况是:该图像文件在Windows属性中确实包含GPS元数据。该文件是一个JPG/HEIC图像,在操作系统的照片详情中可以看到坐标。文件路径存在,文件在Flutter中可以成功打开。EXIF提取本身并未崩溃,但GPS数据缺失或为空。
解决方案
我找到了根本原因。应用程序并不是从文件管理器或原始资源源加载图片的原始格式/路径。相反,它先复制或重新编码图像,而被复制的版本会丢失EXIF元数据,如GPS和时间戳。请重构导入流程,让应用在进行任何拷贝、压缩、转换、缓存、重新大小调整或处理之前,始终从原始图片文件/资源读取并获取元数据。只有在元数据成功提取后,应用才创建任何用于预览/编辑/导出的工作副本或处理版本。这一点至关重要,因为在Flutter的图片选择流程中,拷贝的图片可能会丢失EXIF元数据。