JPG 图像中经常会保存相机记录的图像拍摄位置的 GPS 信息,本文记录 Python 获取图像拍摄位置信息的方法。
EXIF(Exchangeable Image File Format)是一种用于存储图像拍摄相关信息的标准,这些信息包括相机设置、拍摄时间、地点等。EXIF信息通常嵌入在JPEG、TIFF和RAW图像文件中,以便于软件和设备(如数字相机、手机、扫描仪)能够读取和使用这些信息。
在EXIF信息中,GPS信息是一个重要的组成部分,它可以提供关于图像拍摄位置的详细数据。以下是GPS信息可能包含的内容:
通过这些GPS信息,我们可以了解到图像的拍摄位置、时间和拍摄时的运动状态。这些信息对于图片的归档、分享和地理信息系统(GIS)分析等方面非常有用。
可以在 Python 中很容易地获取到图像的 exif 信息,并从中提取 gps 信息,本质上都是从文件中读取 exif 信息字段,将其解析成我们可读的 gps 信息。
这里介绍三种实现方法:
1 | pip install Pillow |
---|
上源码:
12345678910111213141516171819 | from PIL import Image, ExifTagsdef pillow_get_exif_data(image_path): image = Image.open(image_path) # 获取图片的exif信息 exif_data = image._getexif() if exif_data is not None: # 使用自定义的函数转换exif标签 exif_data = { ExifTags.TAGSk: v for k, v in exif_data.items() if k in ExifTags.TAGS } return exif_dataif __name__ == '__main__': image_path = 'demo.jpg' exif_data = pillow_get_exif_data(image_path) print(exif_data'GPSInfo') |
---|
输出:
1 | {0: b'\x02\x03\x00\x00', 1: 'N', 2: (31.0, 5.0, 37.6518), 3: 'E', 4: (121.0, 14.0, 54.4151), 5: b'\x00', 6: 93.606, 7: (2.0, 32.0, 54.0), 9: 'A', 18: 'WGS-84\x00', 29: '2024:05:04'} |
---|
含义:
1 | pip install piexif |
---|
上源码:
12345678910 | import piexifdef piexif_get_exif_data(image_path): exif_dict = piexif.load(image_path) return exif_dictif __name__ == '__main__': image_path = 'demo.jpg' exif_data = piexif_get_exif_data(image_path) print(exif_data'GPS') |
---|
输出:
123456789101112131415161718192021 | 0:(2, 3, 0, 0)1:b'N'2:((31, 1), (5, 1), (376518, 10000))3:b'E'4:((121, 1), (14, 1), (544151, 10000))5:06:(93606, 1000)7:((2, 1), (32, 1), (54, 1))9:b'A'18:b'WGS-84\x00' |
---|
含义:
其中的 tuple 需要第一个数除以第二个数
1 | pip install exifread |
---|
上源码:
12345678910111213 | import exifreaddef exifread_get_exif_data(image_path): f = open(image_path,'rb') contents = exifread.process_file(f) f.close() return contentsif __name__ == '__main__': image_path = 'demo.jpg' contents = exifread_get_exif_data(image_path) print(contents"GPS GPSLongitude", contents'GPS GPSLongitudeRef', contents"GPS GPSLatitude", contents'GPS GPSLatitudeRef', contents"GPS GPSAltitude") |
---|
输出:
1 | 121, 14, 544151/10000 E 31, 5, 188259/5000 N 46803/500 |
---|
连续运行一千次,统计时间:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | from PIL import Image, ExifTagsimport mtutils as mtimport numpy as npimport piexifimport exifreadimport timedef piexif_get_exif_data(image_path): exif_dict = piexif.load(image_path) return exif_dictdef pillow_get_exif_data(image_path): image = Image.open(image_path) # 获取图片的exif信息 exif_data = image._getexif() if exif_data is not None: # 使用自定义的函数转换exif标签 exif_data = { ExifTags.TAGSk: v for k, v in exif_data.items() if k in ExifTags.TAGS } return exif_datadef exifread_get_exif_data(image_path): f = open(image_path,'rb') contents = exifread.process_file(f) f.close() return contents if __name__ == '__main__': image_path = 'demo.JPG' times = 1000 start = time.time() for _ in range(times): exif_data = pillow_get_exif_data(image_path) end = time.time() print(f'pillow_get_exif_data: {end - start}') start = time.time() for _ in range(times): exif_data2 = piexif_get_exif_data(image_path) end = time.time() print(f'piexif_get_exif_data: {end - start}') start = time.time() for _ in range(times): exifread_get_exif_data(image_path) end = time.time() print(f'exifread_get_exif_data: {end - start}') pass |
---|
输出:
123 | pillow_get_exif_data: 0.94569993019104piexif_get_exif_data: 0.17222881317138672exifread_get_exif_data: 0.8518986701965332 |
---|
结论:piexif
又快又好用。