EXIF
可交换图像文件格式(Exchangeable image file format,简称Exif),专门为数码相机的照片设定的,用于记录照片的属性信息和拍摄数据。Exif信息以0xFFE1作为开头标记,后两个字节表示Exif信息的长度,所以Exif信息最大为64kb,而内部采用TIFF格式。
Python读取Exif信息
通过exifread 第三方库来去读取照片的Exif信息。首先需要安装该库。
pip install exifread
读取照片Exif信息
file="your.jpg"
f=open(file,'rb')
tags = exifread.process_file(f)
f.close()
print(tags['Image ImageWidth']) # 获取图片宽度信息
print(tags['Image Orientation']) # 照片拍摄方向
Exif信息说明
Exif标识
GPS信息
图片相关
坐标转换
通过exifread获取的经纬度信息格式通常是下面这样的
纬度 [30, 31, 466751/10000] 经度 [114, 21, 2331/250]
转换公式如下:
度 = 度 + 分/60 + 秒/3600
[30, 31, 466751/10000] = 30 + 31 / 60 + 46.6751 / 3600 = 30.529631972222223
因此坐标转换代码如下:
def convert_gps(coord_arr):
arr = str(coord_arr).replace('[', '').replace(']', '').split(', ')
d = float(arr[0])
m = float(arr[1])
s = float(arr[2].split('/')[0]) / float(arr[2].split('/')[1])
源代码如下:
import os
import exifread
path = r'D:\Camera'
def getfiles(path):
data = []
for root,dirs,files in os.walk(path):
for name in files:
fpath = os.path.join(root,name)
try:
info = readExif(fpath)
data.append(info)
except:
pass
f = open('ploc.csv','a')
f.write('dtime,latitude,longitude,altitude\n')
f.write(''.join(data))
f.close()
def convert_gps(coord_arr):
arr = str(coord_arr).replace('[', '').replace(']', '').split(', ')
d = float(arr[0])
m = float(arr[1])
s = float(arr[2].split('/')[0]) / float(arr[2].split('/')[1])
return float(d) + (float(m) / 60) + (float(s) / 3600)
def readExif(file):
f=open(file,'rb')
tags = exifread.process_file(f,details=False,stop_tag='TAG')
f.close()
lat = tags['GPS GPSLatitude'].printable
lat = convert_gps(lat)
lon = tags['GPS GPSLongitude'].printable
lon = convert_gps(lon)
altitude = tags['GPS GPSAltitude'].printable
altitude = float(altitude.split('/')[0]) / float(altitude.split('/')[1])
dtime = tags['Image DateTime'].printable
return dtime + ','+ str(lat) + ',' + str(lon) + ',' + str(altitude) +'\n'
getfiles(path)
将坐标信息保存在CSV文件中,就可以进行照片点位置可视化啦。
可视化
如果你嫌麻烦,那么推荐Mapbox出品的可视化工具进行可视化,直接将上面得到的CSV文件拖入即可。Data explorerwww.mapbox.cn
以下是我2019年的照片位置可视化。