import tkinter as tk
from tkinter.filedialog import askdirectory,askopenfilename
import EXIF_get_func
import bdmap_get_pos_addr_func as bgpaf
import UCS_convert_func as ucsc
import folium
import webbrowser
def selectPath():
# 选择文件path_接收文件地址
path_ = askopenfilename()
# 通过replace函数替换绝对文件地址中的/来使文件可被程序读取
# 注意:\\转义后为\,所以\\\\转义后为\\
path_ = path_.replace("/", "\\\\")
# path设置path_的值
path.set(path_)
def readentry():
imgpath = entry.get()
#print(imgpath)
aaa = EXIF_get_func.find_exif_image(imgpath)
if aaa['GPS_info']['经度'] != '':
l10101= tk.Label(main_box, text=aaa['GPS_info']["经度方向"], width=15,relief='sunken').grid(row=2, column=1)
l10103= tk.Label(main_box, text=str(int(aaa['GPS_info']['经度']*1000000)/1000000),relief='sunken', width=15).grid(row=2, column=3)
l10105= tk.Label(main_box, text=aaa['GPS_info']["纬度方向"], width=15,relief='sunken').grid(row=2, column=5)
l10107= tk.Label(main_box, text=str(int(aaa['GPS_info']['纬度']*1000000)/1000000),relief='sunken', width=15).grid(row=2, column=7)
l10109= tk.Label(main_box, text=aaa['GPS_info']["高度方向"], width=15,relief='sunken').grid(row=2, column=9)
l10111= tk.Label(main_box, text=aaa['GPS_info']["高度"], width=15,relief='sunken').grid(row=2, column=11)
l10201= tk.Label(main_box, text=aaa['GPS_info']["速度单位"], width=15,relief='sunken').grid(row=3, column=1)
l10203= tk.Label(main_box, text=aaa['GPS_info']["速度"], width=15,relief='sunken').grid(row=3, column=3)
l10305 = tk.Label(main_box, text=aaa['GPS_info']["GPS日期"], width=45,relief='sunken').grid(row=3, column=5,columnspan=3)
l10207= tk.Label(main_box, text=aaa['GPS_info']["GPS时间戳"], width=15,relief='sunken').grid(row=3, column=9)
l10209= tk.Label(main_box, text=aaa['GPS_info']["GPS版本"], width=15,relief='sunken').grid(row=3, column=11)
l10301= tk.Label(main_box, text=aaa['GPS_info']["图像方位参考"], width=15,relief='sunken').grid(row=4, column=1)
l10303= tk.Label(main_box, text=aaa['GPS_info']["图像方位"], width=15,relief='sunken').grid(row=4, column=3)
l10305= tk.Label(main_box, text=aaa['GPS_info']["目标方位参考"], width=15,relief='sunken').grid(row=4, column=5)
l10307= tk.Label(main_box, text=aaa['GPS_info']["目标方位"], width=15,relief='sunken').grid(row=4, column=7)
l10309= tk.Label(main_box, text=aaa['GPS_info']["GPS处理模式"], width=15,relief='sunken').grid(row=4, column=9)
else:
l10101= tk.Label(main_box, text=" ", width=15).grid(row=2, column=1)
l10103= tk.Label(main_box, text=" ", width=15).grid(row=2, column=3)
l10105= tk.Label(main_box, text=" ", width=15).grid(row=2, column=5)
l10107= tk.Label(main_box, text=" ", width=15).grid(row=2, column=7)
l10109= tk.Label(main_box, text=" ", width=15).grid(row=2, column=9)
l10111= tk.Label(main_box, text=" ", width=15).grid(row=2, column=11)
l10201= tk.Label(main_box, text=" ", width=15).grid(row=3, column=1)
l10203= tk.Label(main_box, text=" ", width=15).grid(row=3, column=3)
l10205= tk.Label(main_box, text=" ", width=15).grid(row=3, column=5)
l10207= tk.Label(main_box, text=" ", width=15).grid(row=3, column=7)
l10301= tk.Label(main_box, text=" ", width=15).grid(row=4, column=1)
l10303= tk.Label(main_box, text=" ", width=15).grid(row=4, column=3)
l10305= tk.Label(main_box, text=" ", width=15).grid(row=4, column=5)
l10307= tk.Label(main_box, text=" ", width=15).grid(row=4, column=7)
l10309= tk.Label(main_box, text=" ", width=15).grid(row=4, column=9)
l10311= tk.Label(main_box, text=" ", width=15).grid(row=4, column=11)
l_add1 = tk.Label(main_box, text="照片无经纬度信息", width=70)
l_add1.grid(row=1, column=1, columnspan=8)
l10401= tk.Label(main_box, text=aaa['BASE_info']["生产商"], width=40,relief='sunken').grid(row=5, column=1,columnspan=3)
l10405= tk.Label(main_box, text=aaa['BASE_info']["型号"], width=40,relief='sunken').grid(row=5, column=5,columnspan=3)
l10409= tk.Label(main_box, text=aaa['BASE_info']["场景类型"], width=45, relief='sunken').grid(row=5, column=9,columnspan=3)
l10501= tk.Label(main_box, text=aaa['BASE_info']["镜头规格"], width=40,relief='sunken').grid(row=6, column=1,columnspan=3)
l10505= tk.Label(main_box, text=aaa['BASE_info']["镜头生产商"], width=40,relief='sunken').grid(row=6, column=5,columnspan=3)
l10509= tk.Label(main_box, text=aaa['BASE_info']["镜头型号"], width=40,relief='sunken').grid(row=6, column=9,columnspan=3)
l10601= tk.Label(main_box, text=aaa['BASE_info']["图像高度"], width=15,relief='sunken').grid(row=7, column=1)
l10603= tk.Label(main_box, text=aaa['BASE_info']["图像宽度"], width=15,relief='sunken').grid(row=7, column=3)
l10605= tk.Label(main_box, text=aaa['BASE_info']["颜色深度"], width=15,relief='sunken').grid(row=7, column=5)
l10607= tk.Label(main_box, text=aaa['BASE_info']["文件名"], width=15,relief='sunken').grid(row=7, column=7)
l10609= tk.Label(main_box, text=aaa['BASE_info']["图像描述"], width=15,relief='sunken').grid(row=7, column=9)
l10611= tk.Label(main_box, text=aaa['BASE_info']["方向"], width=15,relief='sunken').grid(row=7, column=11)
l10701= tk.Label(main_box, text=aaa['BASE_info']["水平分辨率"], width=15,relief='sunken').grid(row=8, column=1)
l10703= tk.Label(main_box, text=aaa['BASE_info']["垂直分辨率"], width=15,relief='sunken').grid(row=8, column=3)
l10705= tk.Label(main_box, text=aaa['BASE_info']["分辨率单位"], width=15,relief='sunken').grid(row=8, column=5)
l10707= tk.Label(main_box, text=aaa['BASE_info']["色彩空间"], width=15,relief='sunken').grid(row=8, column=7)
l10709= tk.Label(main_box, text=aaa['BASE_info']["软件"], width=15,relief='sunken').grid(row=8, column=9)
l10711= tk.Label(main_box, text=aaa['BASE_info']["作者"], width=15,relief='sunken').grid(row=8, column=11)
l10801= tk.Label(main_box, text=aaa['BASE_info']["YCbCr定位"], width=15,relief='sunken').grid(row=9, column=1)
l10803= tk.Label(main_box, text=aaa['BASE_info']["曝光时间"], width=15,relief='sunken').grid(row=9, column=3)
l10805= tk.Label(main_box, text=aaa['BASE_info']["光圈系数"], width=15,relief='sunken').grid(row=9, column=5)
l10807= tk.Label(main_box, text=aaa['BASE_info']["ISO感光度"], width=15,relief='sunken').grid(row=9, column=7)
l10809= tk.Label(main_box, text=aaa['BASE_info']["快门速度"], width=15,relief='sunken').grid(row=9, column=9)
l10811= tk.Label(main_box, text=aaa['BASE_info']["光圈"], width=15,relief='sunken').grid(row=9, column=11)
l10901= tk.Label(main_box, text=aaa['BASE_info']["修改时间"], width=40,relief='sunken').grid(row=10, column=1,columnspan=3)
l10905= tk.Label(main_box, text=aaa['BASE_info']["拍摄时间"], width=40,relief='sunken').grid(row=10, column=5,columnspan=3)
l10909= tk.Label(main_box, text=aaa['BASE_info']["写卡时间"], width=40,relief='sunken').grid(row=10, column=9,columnspan=3)
l11001= tk.Label(main_box, text=aaa['BASE_info']["亮度"], width=15,relief='sunken').grid(row=11, column=1)
l11003= tk.Label(main_box, text=aaa['BASE_info']["曝光补偿"], width=15,relief='sunken').grid(row=11, column=3)
l11005= tk.Label(main_box, text=aaa['BASE_info']["最大光圈"], width=15,relief='sunken').grid(row=11, column=5)
l11007= tk.Label(main_box, text=aaa['BASE_info']["测光模式"], width=15,relief='sunken').grid(row=11, column=7)
l11009= tk.Label(main_box, text=aaa['BASE_info']["光源"], width=15,relief='sunken').grid(row=11, column=9)
l11011= tk.Label(main_box, text=aaa['BASE_info']["色彩组合方案"], width=15,relief='sunken').grid(row=11, column=11)
l11101= tk.Label(main_box, text=aaa['BASE_info']["对比度"], width=15,relief='sunken').grid(row=12, column=1)
l11103= tk.Label(main_box, text=aaa['BASE_info']["饱和度"], width=15,relief='sunken').grid(row=12, column=3)
l11105= tk.Label(main_box, text=aaa['BASE_info']["锐度"], width=15,relief='sunken').grid(row=12, column=5)
l11107= tk.Label(main_box, text=aaa['BASE_info']["曝光模式"], width=15,relief='sunken').grid(row=12, column=7)
l11109= tk.Label(main_box, text=aaa['BASE_info']["白平衡"], width=15,relief='sunken').grid(row=12, column=9)
l11111= tk.Label(main_box, text=aaa['BASE_info']["数码变焦比"], width=15,relief='sunken').grid(row=12, column=11)
l11201= tk.Label(main_box, text=aaa['BASE_info']["Exif子IFD偏移"], width=15,relief='sunken').grid(row=13, column=1)
l11203= tk.Label(main_box, text=aaa['BASE_info']["曝光程序"], width=15,relief='sunken').grid(row=13, column=3)
l11205= tk.Label(main_box, text=aaa['BASE_info']["GPS信息长度"], width=15,relief='sunken').grid(row=13, column=5)
l11207= tk.Label(main_box, text=aaa['BASE_info']["Exif版本"], width=15,relief='sunken').grid(row=13, column=7)
l11209= tk.Label(main_box, text=aaa['BASE_info']["闪光灯"], width=45,relief='sunken').grid(row=13, column=9,columnspan=3)
l11301= tk.Label(main_box, text=aaa['BASE_info']["压缩程度"], width=15,relief='sunken').grid(row=14, column=1)
l11303= tk.Label(main_box, text=aaa['BASE_info']["镜头焦距"], width=15,relief='sunken').grid(row=14, column=3)
l11305= tk.Label(main_box, text=aaa['BASE_info']["主题区"], width=15,relief='sunken').grid(row=14, column=5)
l11307= tk.Label(main_box, text=aaa['BASE_info']["厂商注释"], width=15,relief='sunken').grid(row=14, column=7)
l11309= tk.Label(main_box, text=aaa['BASE_info']["用户注释"], width=15,relief='sunken').grid(row=14, column=9)
l11311= tk.Label(main_box, text=aaa['BASE_info']["FlashPix版本"], width=15,relief='sunken').grid(row=14, column=11)
l11401= tk.Label(main_box, text=aaa['BASE_info']["图像宽度"], width=15,relief='sunken').grid(row=15, column=1)
l11403= tk.Label(main_box, text=aaa['BASE_info']["图像高度"], width=15,relief='sunken').grid(row=15, column=3)
l11405= tk.Label(main_box, text=aaa['BASE_info']["通用偏移量"], width=15,relief='sunken').grid(row=15, column=5)
l11407= tk.Label(main_box, text=aaa['BASE_info']["感光模式"], width=45,relief='sunken').grid(row=15, column=7,columnspan=3)
l11409= tk.Label(main_box, text=aaa['BASE_info']["照片来源"], width=15,relief='sunken').grid(row=15, column=11)
l11501= tk.Label(main_box, text=aaa['BASE_info']["自定义渲染"], width=15,relief='sunken').grid(row=16, column=1)
l11503= tk.Label(main_box, text=aaa['BASE_info']["场景捕获类型"], width=15,relief='sunken').grid(row=16, column=3)
l11505= tk.Label(main_box, text=aaa['BASE_info']["增益控制"], width=15,relief='sunken').grid(row=16, column=5)
l11507= tk.Label(main_box, text=aaa['BASE_info']["设备设置详情"], width=15,relief='sunken').grid(row=16, column=7)
l11509= tk.Label(main_box, text=aaa['BASE_info']["主体距离范围"], width=15,relief='sunken').grid(row=16, column=9)
l11511= tk.Label(main_box, text=aaa['BASE_info']["互用性索引"], width=15,relief='sunken').grid(row=16, column=11)
l11601= tk.Label(main_box, text=aaa['BASE_info']["互用性版本"], width=15,relief='sunken').grid(row=17, column=1)
l11603= tk.Label(main_box, text=aaa['BASE_info']["缩略图宽度"], width=15,relief='sunken').grid(row=17, column=3)
l11605= tk.Label(main_box, text=aaa['BASE_info']["缩略图高度"], width=15,relief='sunken').grid(row=17, column=5)
l11607= tk.Label(main_box, text=aaa['BASE_info']["缩略图压缩"], width=15,relief='sunken').grid(row=17, column=7)
l11609= tk.Label(main_box, text=aaa['BASE_info']["缩略图方向"], width=15,relief='sunken').grid(row=17, column=9)
l11701= tk.Label(main_box, text=aaa['BASE_info']["缩略图水平分辨率"], width=15,relief='sunken').grid(row=18, column=1)
l11703= tk.Label(main_box, text=aaa['BASE_info']["缩略图垂直分辨率"], width=15,relief='sunken').grid(row=18, column=3)
l11705= tk.Label(main_box, text=aaa['BASE_info']["缩略图分辨率单位"], width=15,relief='sunken').grid(row=18, column=5)
l11707= tk.Label(main_box, text=aaa['BASE_info']["JPEG交换格式"], width=15,relief='sunken').grid(row=18, column=7)
l11709= tk.Label(main_box, text=aaa['BASE_info']["JPEG格式长度"], width=15,relief='sunken').grid(row=18, column=9)
l_add1 = tk.Label(main_box, text="", width=70)
l_add1.grid(row=1, column=1, columnspan=8)
def get_address():
imgpath = entry.get()
aaa = EXIF_get_func.find_exif_image(imgpath)
if aaa['GPS_info']['经度'] != '':
lat = aaa['GPS_info']['纬度']
lon = aaa['GPS_info']['经度']
lon1,lat1=ucsc.wgs84_to_bd09(lon, lat)
apik = 'Tu1uZzXrlTnkvTAlKZSEZwYKHOngHqMy' # 你的百度地图 API key
add,dictaddr=bgpaf.getlocation(lat1,lon1,apik)
l_add1 = tk.Label(main_box, text=add, width=70)
l_add1.grid(row=1, column=1, columnspan=8)
else:
l_add1 = tk.Label(main_box, text="照片无经纬度信息--无法获取位置", width=70)
l_add1.grid(row=1, column=1, columnspan=8)
def streetmappost():
imgpath = entry.get()
output_file = "map2.html"
aaa = EXIF_get_func.find_exif_image(imgpath)
if aaa['GPS_info']['经度'] != '':
lat = aaa['GPS_info']['纬度']
lon = aaa['GPS_info']['经度']
lon1,lat1=ucsc.wgs84_to_gcj02(lon, lat)
mmm = folium.Map(location=[lat1,lon1],zoom_start=20,tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='AutoNavi') #高德街道图
# mmm = folium.Map(location=[30.527831,114.361304],zoom_start=14,tiles='http://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',attr='AutoNavi') # 高德卫星图
folium.Marker([lat1,lon1]).add_to(mmm)
mmm.save(output_file)
webbrowser.open(output_file, new=2) # open in new tab
else:
l_add1 = tk.Label(main_box, text="照片无经纬度信息--无法地图展示", width=70)
l_add1.grid(row=1, column=1, columnspan=8)
def satmappost():
imgpath = entry.get()
output_file = "map2.html"
aaa = EXIF_get_func.find_exif_image(imgpath)
if aaa['GPS_info']['经度'] != '':
lat = aaa['GPS_info']['纬度']
lon = aaa['GPS_info']['经度']
lon1,lat1=ucsc.wgs84_to_gcj02(lon, lat)
print(lon," ",lon1)
#mmm = folium.Map(location=[lat1,lon1],zoom_start=20,tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='AutoNavi') #高德街道图
mmm = folium.Map(location=[lat1,lon1],zoom_start=20,tiles='http://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',attr='AutoNavi') # 高德卫星图
folium.Marker([lat1,lon1]).add_to(mmm)
mmm.save(output_file)
webbrowser.open(output_file, new=2) # open in new tab
else:
l_add1 = tk.Label(main_box, text="照片无经纬度信息--无法卫星图展示", width=70)
l_add1.grid(row=1, column=1, columnspan=8)
main_box=tk.Tk()
main_box.title('获取照片信息 位置 地图展示')
width = 1300
height = 500
# 获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
screenwidth = main_box.winfo_screenwidth() # 获取屏幕宽度
screenheight = main_box.winfo_screenheight() # 获取屏幕高度
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) # 生成屏幕位置,大小参数
main_box.geometry(alignstr) # 按位置绘制屏幕
# 设置窗口是否可变长、宽,True:可变,False:不可变
main_box.resizable(width=False, height=False) # 敞口的高宽是否可以调整
#变量path
path = tk.StringVar()
#输入框,标记,按键
tk.Label(main_box,text = "目标路径:", width=10).grid(row = 0, column = 0)
#输入框绑定变量path
entry=tk.Entry(main_box, textvariable = path, width=65)
entry.grid(row = 0, column = 1,columnspan=5)
tk.Button(main_box, text = "选择照片", command = selectPath).grid(row = 0, column =6)
tk.Button(main_box, text = "获取信息", command = readentry).grid(row = 0, column = 7)
tk.Button(main_box, text = "获取地址", command = get_address).grid(row = 0, column =8)
tk.Button(main_box, text = "地图展示", command = streetmappost).grid(row = 0, column =9)
tk.Button(main_box, text = "卫星展示", command = satmappost).grid(row = 0, column =10)
l_add = tk.Label(main_box, text="图片地址:", width=10)
l_add.grid(row=1, column=0)
l_add1 = tk.Label(main_box, text=" ", width=70)
l_add1.grid(row=1, column=1,columnspan=8)
l10100= tk.Label(main_box, text="经度方向", bg='yellow', width=12, bd=3, relief='raised').grid(row=2, column=0)
l10102= tk.Label(main_box, text="经度", bg='yellow', width=12, bd=3, relief='raised').grid(row=2, column=2)
l10104= tk.Label(main_box, text="纬度方向", bg='yellow', width=12, bd=3, relief='raised').grid(row=2, column=4)
l10106= tk.Label(main_box, text="纬度", bg='yellow', width=12, bd=3, relief='raised').grid(row=2, column=6)
l10108= tk.Label(main_box, text="高度方向", bg='yellow', width=12, bd=3, relief='raised').grid(row=2, column=8)
l10110= tk.Label(main_box, text="高度", bg='yellow', width=12, bd=3, relief='raised').grid(row=2, column=10)
l10200= tk.Label(main_box, text="速度单位", bg='yellow', width=12, bd=3, relief='raised').grid(row=3, column=0)
l10202= tk.Label(main_box, text="速度", bg='yellow', width=12, bd=3, relief='raised').grid(row=3, column=2)
l10314= tk.Label(main_box, text="GPS日期", bg='yellow', width=12, bd=3, relief='raised').grid(row=3, column=4)
l10206= tk.Label(main_box, text="GPS时间", bg='yellow', width=12, bd=3, relief='raised').grid(row=3, column=8)
l10208= tk.Label(main_box, text="GPS版本", bg='yellow', width=12, bd=3, relief='raised').grid(row=3, column=10)
l10300= tk.Label(main_box, text="图像方位参考", bg='yellow', width=12, bd=3, relief='raised').grid(row=4, column=0)
l10302= tk.Label(main_box, text="图像方位", bg='yellow', width=12, bd=3, relief='raised').grid(row=4, column=2)
l10304= tk.Label(main_box, text="目标方位参考", bg='yellow', width=12, bd=3, relief='raised').grid(row=4, column=4)
l10306= tk.Label(main_box, text="目标方位", bg='yellow', width=12, bd=3, relief='raised').grid(row=4, column=6)
l10308= tk.Label(main_box, text="GPS处理模式", bg='yellow', width=12, bd=3, relief='raised').grid(row=4, column=8)
l10400= tk.Label(main_box, text="生产商", bg='yellow', width=12, bd=3, relief='raised').grid(row=5, column=0)
l10404= tk.Label(main_box, text="型号", bg='yellow', width=12, bd=3, relief='raised').grid(row=5, column=4)
l10408= tk.Label(main_box, text="场景类型", bg='yellow', width=12, bd=3, relief='raised').grid(row=5, column=8)
l10500= tk.Label(main_box, text="镜头规格", bg='yellow', width=12, bd=3, relief='raised').grid(row=6, column=0)
l10504= tk.Label(main_box, text="镜头生产商", bg='yellow', width=12, bd=3, relief='raised').grid(row=6, column=4)
l10508= tk.Label(main_box, text="镜头型号", bg='yellow', width=12, bd=3, relief='raised').grid(row=6, column=8)
l10600= tk.Label(main_box, text="图像高度", bg='yellow', width=12, bd=3, relief='raised').grid(row=7, column=0)
l10602= tk.Label(main_box, text="图像宽度", bg='yellow', width=12, bd=3, relief='raised').grid(row=7, column=2)
l10604= tk.Label(main_box, text="颜色深度", bg='yellow', width=12, bd=3, relief='raised').grid(row=7, column=4)
l10606= tk.Label(main_box, text="文件名", bg='yellow', width=12, bd=3, relief='raised').grid(row=7, column=6)
l10608= tk.Label(main_box, text="图像描述", bg='yellow', width=12, bd=3, relief='raised').grid(row=7, column=8)
l10610= tk.Label(main_box, text="方向", bg='yellow', width=12, bd=3, relief='raised').grid(row=7, column=10)
l10700= tk.Label(main_box, text="水平分辨率", bg='yellow', width=12, bd=3, relief='raised').grid(row=8, column=0)
l10702= tk.Label(main_box, text="垂直分辨率", bg='yellow', width=12, bd=3, relief='raised').grid(row=8, column=2)
l10704= tk.Label(main_box, text="分辨率单位", bg='yellow', width=12, bd=3, relief='raised').grid(row=8, column=4)
l10706= tk.Label(main_box, text="色彩空间", bg='yellow', width=12, bd=3, relief='raised').grid(row=8, column=6)
l10708= tk.Label(main_box, text="软件", bg='yellow', width=12, bd=3, relief='raised').grid(row=8, column=8)
l10710= tk.Label(main_box, text="作者", bg='yellow', width=12, bd=3, relief='raised').grid(row=8, column=10)
l10800= tk.Label(main_box, text="YCbCr定位", bg='yellow', width=12, bd=3, relief='raised').grid(row=9, column=0)
l10802= tk.Label(main_box, text="曝光时间", bg='yellow', width=12, bd=3, relief='raised').grid(row=9, column=2)
l10804= tk.Label(main_box, text="光圈系数", bg='yellow', width=12, bd=3, relief='raised').grid(row=9, column=4)
l10806= tk.Label(main_box, text="ISO感光度", bg='yellow', width=12, bd=3, relief='raised').grid(row=9, column=6)
l10808= tk.Label(main_box, text="快门速度", bg='yellow', width=12, bd=3, relief='raised').grid(row=9, column=8)
l10810= tk.Label(main_box, text="光圈", bg='yellow', width=12, bd=3, relief='raised').grid(row=9, column=10)
l10900= tk.Label(main_box, text="修改时间", bg='yellow', width=12, bd=3, relief='raised').grid(row=10, column=0)
l10904= tk.Label(main_box, text="拍摄时间", bg='yellow', width=12, bd=3, relief='raised').grid(row=10, column=4)
l10908= tk.Label(main_box, text="写卡时间", bg='yellow', width=12, bd=3, relief='raised').grid(row=10, column=8)
l11000= tk.Label(main_box, text="亮度", bg='yellow', width=12, bd=3, relief='raised').grid(row=11, column=0)
l11002= tk.Label(main_box, text="曝光补偿", bg='yellow', width=12, bd=3, relief='raised').grid(row=11, column=2)
l11004= tk.Label(main_box, text="最大光圈", bg='yellow', width=12, bd=3, relief='raised').grid(row=11, column=4)
l11006= tk.Label(main_box, text="测光模式", bg='yellow', width=12, bd=3, relief='raised').grid(row=11, column=6)
l11008= tk.Label(main_box, text="光源", bg='yellow', width=12, bd=3, relief='raised').grid(row=11, column=8)
l11010= tk.Label(main_box, text="色彩组合方案", bg='yellow', width=12, bd=3, relief='raised').grid(row=11, column=10)
l11100= tk.Label(main_box, text="对比度", bg='yellow', width=12, bd=3, relief='raised').grid(row=12, column=0)
l11102= tk.Label(main_box, text="饱和度", bg='yellow', width=12, bd=3, relief='raised').grid(row=12, column=2)
l11104= tk.Label(main_box, text="锐度", bg='yellow', width=12, bd=3, relief='raised').grid(row=12, column=4)
l11106= tk.Label(main_box, text="曝光模式", bg='yellow', width=12, bd=3, relief='raised').grid(row=12, column=6)
l11108= tk.Label(main_box, text="白平衡", bg='yellow', width=12, bd=3, relief='raised').grid(row=12, column=8)
l11110= tk.Label(main_box, text="数码变焦比", bg='yellow', width=12, bd=3, relief='raised').grid(row=12, column=10)
l11200= tk.Label(main_box, text="Exif子IFD偏移", bg='yellow', width=12, bd=3, relief='raised').grid(row=13, column=0)
l11202= tk.Label(main_box, text="曝光程序", bg='yellow', width=12, bd=3, relief='raised').grid(row=13, column=2)
l11204= tk.Label(main_box, text="GPS信息长度", bg='yellow', width=12, bd=3, relief='raised').grid(row=13, column=4)
l11206= tk.Label(main_box, text="Exif版本", bg='yellow', width=12, bd=3, relief='raised').grid(row=13, column=6)
l11208= tk.Label(main_box, text="闪光灯", bg='yellow', width=12, bd=3, relief='raised').grid(row=13, column=8)
l11300= tk.Label(main_box, text="压缩程度", bg='yellow', width=12, bd=3, relief='raised').grid(row=14, column=0)
l11302= tk.Label(main_box, text="镜头焦距", bg='yellow', width=12, bd=3, relief='raised').grid(row=14, column=2)
l11304= tk.Label(main_box, text="主题区", bg='yellow', width=12, bd=3, relief='raised').grid(row=14, column=4)
l11306= tk.Label(main_box, text="厂商注释", bg='yellow', width=12, bd=3, relief='raised').grid(row=14, column=6)
l11308= tk.Label(main_box, text="用户注释", bg='yellow', width=12, bd=3, relief='raised').grid(row=14, column=8)
l11310= tk.Label(main_box, text="FlashPix版本", bg='yellow', width=12, bd=3, relief='raised').grid(row=14, column=10)
l11400= tk.Label(main_box, text="图像宽度", bg='yellow', width=12, bd=3, relief='raised').grid(row=15, column=0)
l11402= tk.Label(main_box, text="图像高度", bg='yellow', width=12, bd=3, relief='raised').grid(row=15, column=2)
l11404= tk.Label(main_box, text="通用偏移量", bg='yellow', width=12, bd=3, relief='raised').grid(row=15, column=4)
l11406= tk.Label(main_box, text="感光模式", bg='yellow', width=12, bd=3, relief='raised').grid(row=15, column=6)
l11408= tk.Label(main_box, text="照片来源", bg='yellow', width=12, bd=3, relief='raised').grid(row=15, column=10)
l11500= tk.Label(main_box, text="自定义渲染", bg='yellow', width=12, bd=3, relief='raised').grid(row=16, column=0)
l11502= tk.Label(main_box, text="场景捕获类型", bg='yellow', width=12, bd=3, relief='raised').grid(row=16, column=2)
l11504= tk.Label(main_box, text="增益控制", bg='yellow', width=12, bd=3, relief='raised').grid(row=16, column=4)
l11506= tk.Label(main_box, text="设备设置详情", bg='yellow', width=12, bd=3, relief='raised').grid(row=16, column=6)
l11508= tk.Label(main_box, text="主体距离范围", bg='yellow', width=12, bd=3, relief='raised').grid(row=16, column=8)
l11510= tk.Label(main_box, text="互用性索引", bg='yellow', width=12, bd=3, relief='raised').grid(row=16, column=10)
l11600= tk.Label(main_box, text="互用性版本", bg='yellow', width=12, bd=3, relief='raised').grid(row=17, column=0)
l11602= tk.Label(main_box, text="缩略图宽度", bg='yellow', width=12, bd=3, relief='raised').grid(row=17, column=2)
l11604= tk.Label(main_box, text="缩略图高度", bg='yellow', width=12, bd=3, relief='raised').grid(row=17, column=4)
l11606= tk.Label(main_box, text="缩略图压缩", bg='yellow', width=12, bd=3, relief='raised').grid(row=17, column=6)
l11608= tk.Label(main_box, text="缩略图方向", bg='yellow', width=12, bd=3, relief='raised').grid(row=17, column=8)
l11700= tk.Label(main_box, text="缩略图水平分辨率", bg='yellow', width=12, bd=3, relief='raised').grid(row=18, column=0)
l11702= tk.Label(main_box, text="缩略图垂直分辨率", bg='yellow', width=12, bd=3, relief='raised').grid(row=18, column=2)
l11704= tk.Label(main_box, text="缩略图分辨率单位", bg='yellow', width=12, bd=3, relief='raised').grid(row=18, column=4)
l11706= tk.Label(main_box, text="JPEG交换格式", bg='yellow', width=12, bd=3, relief='raised').grid(row=18, column=6)
l11708= tk.Label(main_box, text="JPEG格式长度", bg='yellow', width=12, bd=3, relief='raised').grid(row=18, column=8)
l10101= tk.Label(main_box, text=" ", width=15).grid(row=2, column=1)
l10103= tk.Label(main_box, text=" ", width=15).grid(row=2, column=3)
l10105= tk.Label(main_box, text=" ", width=15).grid(row=2, column=5)
l10107= tk.Label(main_box, text=" ", width=15).grid(row=2, column=7)
l10109= tk.Label(main_box, text=" ", width=15).grid(row=2, column=9)
l10111= tk.Label(main_box, text=" ", width=15).grid(row=2, column=11)
l10201= tk.Label(main_box, text=" ", width=15).grid(row=3, column=1)
l10203= tk.Label(main_box, text=" ", width=15).grid(row=3, column=3)
l10205= tk.Label(main_box, text=" ", width=15).grid(row=3, column=5)
l10207= tk.Label(main_box, text=" ", width=15).grid(row=3, column=7)
l10301= tk.Label(main_box, text=" ", width=15).grid(row=4, column=1)
l10303= tk.Label(main_box, text=" ", width=15).grid(row=4, column=3)
l10305= tk.Label(main_box, text=" ", width=15).grid(row=4, column=5)
l10307= tk.Label(main_box, text=" ", width=15).grid(row=4, column=7)
l10309= tk.Label(main_box, text=" ", width=15).grid(row=4, column=9)
l10311= tk.Label(main_box, text=" ", width=15).grid(row=4, column=11)
l10401= tk.Label(main_box, text=" ", width=40).grid(row=5, column=1,columnspan=3)
l10405= tk.Label(main_box, text=" ", width=40).grid(row=5, column=5,columnspan=3)
l10501= tk.Label(main_box, text=" ", width=40).grid(row=6, column=1,columnspan=3)
l10505= tk.Label(main_box, text=" ", width=40).grid(row=6, column=5,columnspan=3)
l10509= tk.Label(main_box, text=" ", width=40).grid(row=6, column=9,columnspan=3)
l10601= tk.Label(main_box, text=" ", width=15).grid(row=7, column=1)
l10603= tk.Label(main_box, text=" ", width=15).grid(row=7, column=3)
l10605= tk.Label(main_box, text=" ", width=15).grid(row=7, column=5)
l10607= tk.Label(main_box, text=" ", width=15).grid(row=7, column=7)
l10609= tk.Label(main_box, text=" ", width=15).grid(row=7, column=9)
l10611= tk.Label(main_box, text=" ", width=15).grid(row=7, column=11)
l10701= tk.Label(main_box, text=" ", width=15).grid(row=8, column=1)
l10703= tk.Label(main_box, text=" ", width=15).grid(row=8, column=3)
l10705= tk.Label(main_box, text=" ", width=15).grid(row=8, column=5)
l10707= tk.Label(main_box, text=" ", width=15).grid(row=8, column=7)
l10709= tk.Label(main_box, text=" ", width=15).grid(row=8, column=9)
l10711= tk.Label(main_box, text=" ", width=15).grid(row=8, column=11)
l10801= tk.Label(main_box, text=" ", width=15).grid(row=9, column=1)
l10803= tk.Label(main_box, text=" ", width=15).grid(row=9, column=3)
l10805= tk.Label(main_box, text=" ", width=15).grid(row=9, column=5)
l10807= tk.Label(main_box, text=" ", width=15).grid(row=9, column=7)
l10809= tk.Label(main_box, text=" ", width=15).grid(row=9, column=9)
l10811= tk.Label(main_box, text=" ", width=15).grid(row=9, column=11)
l10901= tk.Label(main_box, text=" ", width=40).grid(row=10, column=1,columnspan=3)
l10905= tk.Label(main_box, text=" ", width=40).grid(row=10, column=5,columnspan=3)
l10909= tk.Label(main_box, text=" ", width=40).grid(row=10, column=9,columnspan=3)
l11001= tk.Label(main_box, text=" ", width=15).grid(row=11, column=1)
l11003= tk.Label(main_box, text=" ", width=15).grid(row=11, column=3)
l11005= tk.Label(main_box, text=" ", width=15).grid(row=11, column=5)
l11007= tk.Label(main_box, text=" ", width=15).grid(row=11, column=7)
l11009= tk.Label(main_box, text=" ", width=15).grid(row=11, column=9)
l11011= tk.Label(main_box, text=" ", width=15).grid(row=11, column=11)
l11101= tk.Label(main_box, text=" ", width=15).grid(row=12, column=1)
l11103= tk.Label(main_box, text=" ", width=15).grid(row=12, column=3)
l11105= tk.Label(main_box, text=" ", width=15).grid(row=12, column=5)
l11107= tk.Label(main_box, text=" ", width=15).grid(row=12, column=7)
l11109= tk.Label(main_box, text=" ", width=15).grid(row=12, column=9)
l11111= tk.Label(main_box, text=" ", width=15).grid(row=12, column=11)
l11201= tk.Label(main_box, text=" ", width=15).grid(row=13, column=1)
l11203= tk.Label(main_box, text=" ", width=15).grid(row=13, column=3)
l11205= tk.Label(main_box, text=" ", width=15).grid(row=13, column=5)
l11207= tk.Label(main_box, text=" ", width=15).grid(row=13, column=7)
l11209= tk.Label(main_box, text=" ", width=15).grid(row=13, column=9)
l11301= tk.Label(main_box, text=" ", width=15).grid(row=14, column=1)
l11303= tk.Label(main_box, text=" ", width=15).grid(row=14, column=3)
l11305= tk.Label(main_box, text=" ", width=15).grid(row=14, column=5)
l11307= tk.Label(main_box, text=" ", width=15).grid(row=14, column=7)
l11309= tk.Label(main_box, text=" ", width=15).grid(row=14, column=9)
l11311= tk.Label(main_box, text=" ", width=15).grid(row=14, column=11)
l11401= tk.Label(main_box, text=" ", width=15).grid(row=15, column=1)
l11403= tk.Label(main_box, text=" ", width=15).grid(row=15, column=3)
l11405= tk.Label(main_box, text=" ", width=15).grid(row=15, column=5)
l11407= tk.Label(main_box, text=" ", width=15).grid(row=15, column=7)
l11409= tk.Label(main_box, text=" ", width=15).grid(row=15, column=9)
l11411= tk.Label(main_box, text=" ", width=15).grid(row=15, column=11)
l11501= tk.Label(main_box, text=" ", width=15).grid(row=16, column=1)
l11503= tk.Label(main_box, text=" ", width=15).grid(row=16, column=3)
l11505= tk.Label(main_box, text=" ", width=15).grid(row=16, column=5)
l11507= tk.Label(main_box, text=" ", width=15).grid(row=16, column=7)
l11509= tk.Label(main_box, text=" ", width=15).grid(row=16, column=9)
l11511= tk.Label(main_box, text=" ", width=15).grid(row=16, column=11)
l11601= tk.Label(main_box, text=" ", width=15).grid(row=17, column=1)
l11603= tk.Label(main_box, text=" ", width=15).grid(row=17, column=3)
l11605= tk.Label(main_box, text=" ", width=15).grid(row=17, column=5)
l11607= tk.Label(main_box, text=" ", width=15).grid(row=17, column=7)
l11609= tk.Label(main_box, text=" ", width=15).grid(row=17, column=9)
l11701= tk.Label(main_box, text=" ", width=15).grid(row=18, column=1)
l11703= tk.Label(main_box, text=" ", width=15).grid(row=18, column=3)
l11705= tk.Label(main_box, text=" ", width=15).grid(row=18, column=5)
l11707= tk.Label(main_box, text=" ", width=15).grid(row=18, column=7)
l11709= tk.Label(main_box, text=" ", width=15).grid(row=18, column=9)
main_box.mainloop()
下面是自己编的(借鉴了网上的例程)获取EXIF的函数 import EXIF_get_func
#!/usr/bin/env python
# coding:utf-8
import exifread
import re
from math import radians, cos, sin, asin, sqrt
def latitude_and_longitude_convert_to_decimal_system(*arg):
"""
经纬度转为小数, 作者尝试适用于iphone6、ipad2以上的拍照的照片,
:param arg:
:return: 十进制小数
"""
return float(arg[0]) + ((float(arg[1]) + (float(arg[2].split('/')[0]) / float(arg[2].split('/')[-1]) / 60)) / 60)
def find_exif_image(pic_path):
#print(pic_path)
GPS = {'GPS版本':'','高度方向':'','高度':'','GPS时间戳':'','速度单位':'','速度':'','图像方位参考':'','图像方位':'',
'目标方位参考':'','目标方位':'','GPS处理模式':'','GPS日期':'','经度方向':'','纬度方向':'','纬度':'','经度':''}
info = {'图像宽度':'','图像高度':'','颜色深度':'','文件名':'','图像描述':'','生产商':'','型号':'','方向':'','水平分辨率':'',
'垂直分辨率':'','分辨率单位':'','软件':'','修改时间':'','作者':'','YCbCr定位':'','曝光时间':'','光圈系数':'',
'Exif子IFD偏移':'','曝光程序':'','GPS信息长度':'','ISO感光度':'','Exif版本':'','拍摄时间':'','写卡时间':'',
'色彩组合方案':'','压缩程度':'','快门速度':'','光圈':'','亮度':'','曝光补偿':'','最大光圈':'','测光模式':'','光源':'',
'闪光灯':'','镜头焦距':'','主题区':'','厂商注释':'','用户注释':'','修改时间(毫秒)':'','拍摄时间(毫秒)':'','写卡时间(毫秒)':'',
'FlashPix版本':'','色彩空间':'','图像宽度 ':'','图像高度 ':'','通用偏移量':'','感光模式':'','照片来源':'','场景类型':'',
'自定义渲染':'','曝光模式':'','白平衡':'','数码变焦比':'','场景捕获类型':'','增益控制':'','对比度':'','饱和度':'',
'锐度':'','设备设置详情':'','主体距离范围':'','镜头规格':'','镜头生产商':'','镜头型号':'','互用性索引':'','互用性版本':'',
'缩略图宽度':'','缩略图高度':'','缩略图压缩':'','缩略图方向':'','缩略图水平分辨率':'','缩略图垂直分辨率':'',
'缩略图分辨率单位':'','JPEG交换格式':'','JPEG格式长度':''}
date = ''
with open(pic_path, 'rb') as f:
tags = exifread.process_file(f)
if 'EXIF Flash' in tags:
tags['EXIF Flashx']=tags['EXIF Flash']
if 'EXIF SubSecTime' in tags:
tags['EXIF SubSecTimex'] = tags['EXIF SubSecTime']
for tag, value in tags.items():
if re.match('Image ImageWidth', tag):
info['图像宽度'] = str(value)
if re.match('Image ImageLength', tag):
info['图像高度'] = str(value)
if re.match('Image BitsPerSample', tag):
info['颜色深度'] = str(value)
if re.match('EXIF DocumentName', tag):
info['文件名'] = str(value)
if re.match('ImageDescription', tag):
info['图像描述'] = str(value)
if re.match('Image Make', tag):
info['生产商'] = str(value)
if re.match('Image Model', tag):
info['型号'] = str(value)
if re.match('Image Orientation', tag):
info['方向'] = str(value)
if re.match('Image XResolution', tag):
info['水平分辨率'] = str(value)
if re.match('Image YResolution', tag):
info['垂直分辨率'] = str(value)
if re.match('Image ResolutionUnit', tag):
info['分辨率单位'] = str(value)
if re.match('Image Software', tag):
info['软件'] = str(value)
if re.match('Artist', tag):
info['作者'] = str(value)
if re.match('Image YCbCrPositioning', tag):
info['YCbCr定位'] = str(value)
if re.match('EXIF ExposureTime', tag):
a, b = [x for x in str(value).split('/')]
expt=int(int(a)/int(b)*1000)/1000
info['曝光时间'] = str(expt)
if re.match('EXIF FNumber', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
xape=int(int(a)/int(b)*1000)/1000
info['光圈系数'] = str(xape)
else:
info['光圈系数'] = str(value)
if re.match('Image ExifOffset', tag):
info['Exif子IFD偏移量'] = str(value)
if re.match('EXIF ExposureProgram', tag):
info['曝光程序'] = str(value)
if re.match('Image GPSInfo', tag):
info['GPS信息长度'] = str(value)
if re.match('EXIF ISOSpeedRatings', tag):
info['ISO感光度'] = str(value)
if re.match('EXIF ExifVersion', tag):
info['Exif版本'] = str(value)
if re.match('Image DateTime', tag):
info['修改时间'] = str(value)
if re.match('EXIF DateTimeOriginal', tag):
info['拍摄时间'] = str(value)
if re.match('EXIF DateTimeDigitized', tag):
info['写卡时间'] = str(value)
if re.match('EXIF ComponentsConfiguration', tag):
info['色彩组合方案'] = str(value)
if re.match('EXIF CompressedBitsPerPixel', tag):
info['压缩程度'] = str(value)
if re.match('EXIF ShutterSpeedValue', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
speed=int(int(b)/int(a)*1000)/1000
info['快门速度'] = str(speed)
else:
info['快门速度'] = str(value)
if re.match('EXIF ApertureValue', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
ape=int(int(a)/int(b)*1000)/1000
info['光圈'] = str(ape)
else:
info['光圈'] = str(value)
if re.match('EXIF BrightnessValue', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
br_value=int(int(a)/int(b)*1000)/1000
info['亮度'] = str(br_value)
else:
info['亮度'] = str(value)
if re.match('EXIF ExposureBiasValue', tag):
info['曝光补偿'] = str(value)
if re.match('EXIF MaxApertureValue', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
mape=int(int(a)/int(b)*1000)/1000
info['最大光圈'] = str(mape)
else:
info['最大光圈'] = str(value)
if re.match('EXIF MeteringMode', tag):
info['测光模式'] = str(value)
if re.match('EXIF Lightsource', tag):
info['光源'] = str(value)
if re.match('EXIF Flashx', tag):
info['闪光灯'] = str(value)
if re.match('EXIF FocalLength', tag):
info['镜头焦距'] = str(value)
if re.match('EXIF SubjectArea', tag):
info['主题区'] = str(value)
if re.match('MakerNote', tag):
info['厂商注释'] = str(value)
if re.match('UserComment', tag):
info['用户注释'] = str(value)
if re.match('EXIF SubSecTimex', tag):
info['修改时间(毫秒)'] = str(value)
if re.match('EXIF SubSecTimeOriginal', tag):
info['拍摄时间(毫秒)']=str(value)
if re.match('EXIF SubSecTimeDigitized', tag):
info['写卡时间(毫秒)']=str(value)
if re.match('EXIF FlashPixVersion', tag):
info['FlashPix版本'] = str(value)
if re.match('EXIF ColorSpace', tag):
info['色彩空间'] = str(value)
if re.match('EXIF ExifImageWidth', tag):
info['图像宽度'] = str(value)
if re.match('EXIF ExifImageLength', tag):
info['图像高度'] = str(value)
if re.match('EXIF InteroperabilityOffset', tag):
info['通用偏移量'] = str(value)
if re.match('EXIF SensingMethod', tag):
info['感光模式'] = str(value)
if re.match('EXIF FileSource', tag):
info['照片来源'] = str(value)
if re.match('EXIF SceneType', tag):
info['场景类型'] = str(value)
if re.match('EXIF CustomRendered', tag):
info['自定义渲染'] = str(value)
if re.match('EXIF ExposureMode', tag):
info['曝光模式'] = str(value)
if re.match('EXIF WhiteBalance', tag):
info['白平衡'] = str(value)
if re.match('EXIF DigitalZoomRatio', tag):
info['数码变焦比'] = str(value)
if re.match('EXIF SceneCaptureType', tag):
info['场景捕获类型'] = str(value)
if re.match('EXIF GainControl', tag):
info['增益控制'] = str(value)
if re.match('EXIF Contrast', tag):
info['对比度'] = str(value)
if re.match('EXIF Saturation', tag):
info['饱和度'] = str(value)
if re.match('EXIF Sharpness', tag):
info['锐度'] = str(value)
if re.match('Image DeviceSettingDescription', tag):
info['设备设置详情'] = str(value)
if re.match('EXIF SubjectDistanceRange', tag):
info['主体距离范围'] = str(value)
if re.match('EXIF LensSpecification', tag):
info['镜头规格'] = str(value)
if re.match('EXIF LensMake', tag):
info['镜头生产商'] = str(value)
if re.match('EXIF LensModel', tag):
info['镜头型号'] = str(value)
if re.match('GPS GPSVersionID', tag):
GPS['GPS版本'] = str(value)
if re.match('GPS GPSAltitudeRef', tag):
if str(value)=="0":
GPS['高度方向'] = "正海拔"
elif str(value)=="1":
GPS['高度方向'] = "负海拔"
if re.match('GPS GPSAltitude', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
if str(a)=="0" or str(b)=="0" :
GPS['高度'] = str(value)
else:
gpsa=int(int(a)/int(b)*1000)/1000
GPS['高度'] = str(gpsa)
else:
GPS['高度'] = str(value)
if re.match('GPS GPSTimeStamp', tag):
time_st =str(value)[1:-1]
a, b, c = [x for x in str(time_st).split(',')]
if "/" in a:
GPS['GPS时间戳']=""
else:
if int(a)+8<10 :
a="0"+str(int(a)+8)
else:
a = str(int(a) + 8)
c=c[1:]
if '/' in c :
d,e=[x for x in c.split('/')]
if int(e)==0:
c = "00"
else:
c= int(d)/int(e)
GPS['GPS时间戳'] = str(a)+":"+str(b[1:])+":"+str(c)
if re.match('GPS GPSSpeedRef', tag):
if str(value)=="K":
GPS['速度单位'] = "公里/小时"
elif str(value)=="M":
GPS['速度单位'] = "英里/小时"
else:
GPS['速度单位'] = "海里/小时"
if re.match('GPS GPSSpeed', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
imgd=int(int(a)/int(b)*1000)/1000
GPS['速度'] = str(imgd)
else:
GPS['速度'] = str(value)
if re.match('GPS GPSImgDirectionRef', tag):
if str(value)=="T":
GPS['图像方位参考'] = "地理北"
else:
GPS['图像方位参考'] = "地磁北"
if re.match('GPS GPSImgDirection', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
imgd=int(int(a)/int(b)*1000)/1000
GPS['图像方位'] = str(imgd)
else:
GPS['图像方位'] = str(value)
if re.match('GPS GPSDestBearingRef', tag):
if str(value) == "T":
GPS['目标方位参考'] = "地理北"
else:
GPS['目标方位参考'] = "地磁北"
if re.match('GPS GPSDestBearing', tag):
if '/' in str(value):
a, b = [x for x in str(value).split('/')]
destb=int(int(a)/int(b)*1000)/1000
GPS['目标方位'] = str(destb)
else:
GPS['目标方位'] = str(value)
if re.match('GPS GPSProcessingMethod', tag):
GPS['GPS处理模式'] = str(value)
if re.match('GPS GPSDate', tag):
GPS['GPS日期'] = str(value)+" "+GPS['GPS时间戳']
if re.match('Interoperability InteroperabilityIndex', tag):
info['互用性索引'] = str(value)
if re.match('Interoperability InteroperabilityVersion', tag):
info['互用性版本'] = str(value)
if re.match('Thumbnail ImageWidth', tag):
info['缩略图宽度'] = str(value)
if re.match('Thumbnail ImageLength', tag):
info['缩略图高度'] = str(value)
if re.match('Thumbnail Compression', tag):
info['缩略图压缩'] = str(value)
if re.match('Thumbnail Orientation', tag):
info['缩略图方向'] = str(value)
if re.match('Thumbnail XResolution', tag):
info['缩略图水平分辨率'] = str(value)
if re.match('Thumbnail YResolution', tag):
info['缩略图垂直分辨率'] = str(value)
if re.match('Thumbnail ResolutionUnit', tag):
info['缩略图分辨率单位'] = str(value)
if re.match('Thumbnail JPEGInterchangeFormat', tag):
info['JPEG交换格式'] = str(value)
if re.match('Thumbnail JPEGInterchangeFormatLength', tag):
info['JPEG格式长度'] = str(value)
if re.match('GPS GPSLatitudeRef', tag):
if str(value) == "N":
GPS['纬度方向'] = "北纬"
else:
GPS['纬度方向'] = "南纬"
elif re.match('GPS GPSLongitudeRef', tag):
if str(value) == "E":
GPS['经度方向'] = "东经"
else:
GPS['经度方向'] = "西经"
elif re.match('GPS GPSLatitude', tag):
try:
match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
GPS['纬度'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
except:
deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
if str(deg)=="0/0" or str(min)=="0/0" or str(sec)=="0/0" :
GPS['纬度']=""
else:
GPS['纬度'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec)
elif re.match('GPS GPSLongitude', tag):
try:
match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
GPS['经度'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
except:
deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
if str(deg)=="0/0" or str(min)=="0/0" or str(sec)=="0/0" :
GPS['经度'] = ""
else:
GPS['经度'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec)
elif re.match('.*Date.*', tag):
date = str(value)
return {'BASE_info': info,'GPS_info': GPS} # 字典套字典
def distance(lat1, lon1, lat2, lon2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [float(lon1), float(lat1), float(lon2), float(lat2)])
# haversine 公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径,单位为公里
return c * r * 1000
def exifget(picturepath):
if len(picturepath) >= 2:
#print('[*] 打开文件: ' + picturepath)
exif_info = find_exif_image(pic_path=picturepath)
return(exif_info)
下面是自己编的(借鉴的网上的例程)进行坐标转换的函数 import UCS_convert_func
# -*- coding: utf-8 -*-
# 也即WGS-84坐标是一个国际的标准,一般卫星导航,原始的GPS设备中的数据都是采用这一坐标系。
# 国外的Google地图、OSM等采用的都是这一坐标。
# 百度坐标BD-09坐标是百度公司出于商业保护在国测局坐标基础上进行的二次加密
# 国测局坐标GCJ-02坐标也叫火星坐标,是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,
# 基本国内的电子地图、导航设备都是采用的这一坐标系,如:高德、搜搜、51地图MapABC地图,谷歌中国地图也是。
# bd09_to_gcj02, bd09_to_wgs84, gcj02_to_bd09, gcj02_to_wgs84, wgs84_to_gcj02, wgs84_to_bd09
import json
import requests
import math
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626 # π
a = 6378245.0 # 长半轴
ee = 0.00669342162296594323 # 偏心率平方
def gcj02_to_bd09(lng, lat):
"""
火星坐标系(GCJ-02)转百度坐标系(BD-09)
谷歌、高德——>百度
:param lng:火星坐标经度
:param lat:火星坐标纬度
:return:
"""
z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)
theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)
bd_lng = z * math.cos(theta) + 0.0065
bd_lat = z * math.sin(theta) + 0.006
return [bd_lng, bd_lat]
def bd09_to_gcj02(bd_lon, bd_lat):
"""
百度坐标系(BD-09)转火星坐标系(GCJ-02)
百度——>谷歌、高德
:param bd_lat:百度坐标纬度
:param bd_lon:百度坐标经度
:return:转换后的坐标列表形式
"""
x = bd_lon - 0.0065
y = bd_lat - 0.006
z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
gg_lng = z * math.cos(theta)
gg_lat = z * math.sin(theta)
return [gg_lng, gg_lat]
def wgs84_to_gcj02(lng, lat):
"""
WGS84转GCJ02(火星坐标系)
:param lng:WGS84坐标系的经度
:param lat:WGS84坐标系的纬度
:return:
"""
if out_of_china(lng, lat): # 判断是否在国内
return [lng, lat]
dlat = _transformlat(lng - 105.0, lat - 35.0)
dlng = _transformlng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * pi
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
mglat = lat + dlat
mglng = lng + dlng
return [mglng, mglat]
def gcj02_to_wgs84(lng, lat): # 国测局坐标GCJ-02坐标也叫火星坐标
"""
GCJ02(火星坐标系)转GPS84
:param lng:火星坐标系的经度
:param lat:火星坐标系纬度
:return:
"""
if out_of_china(lng, lat):
return [lng, lat]
dlat = _transformlat(lng - 105.0, lat - 35.0)
dlng = _transformlng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * pi
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
mglat = lat + dlat
mglng = lng + dlng
return [lng * 2 - mglng, lat * 2 - mglat]
def bd09_to_wgs84(bd_lon, bd_lat): # 百度坐标BD-09坐标是百度公司出于商业保护在国测局坐标基础上进行的二次加密
lon, lat = bd09_to_gcj02(bd_lon, bd_lat)
return gcj02_to_wgs84(lon, lat)
def wgs84_to_bd09(lon, lat):
lon, lat = wgs84_to_gcj02(lon, lat)
return gcj02_to_bd09(lon, lat)
def _transformlat(lng, lat):
ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(lat * pi) + 40.0 *
math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
math.sin(lat * pi / 30.0)) * 2.0 / 3.0
return ret
def _transformlng(lng, lat):
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(lng * pi) + 40.0 *
math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
return ret
def out_of_china(lng, lat):
"""
判断是否在国内,不在国内不做偏移
:param lng:
:param lat:
:return:
"""
return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)
下面是自己编的获取百度地址的函数 import bdmap_get_pos_addr_func
import json
import requests
import urllib
def getPosition(add,Apik):
'''返回经纬度信息'''
url = 'http://api.map.baidu.com/geocoding/v3/?address={inputAddress}&output=json&ak={myAk}'.format(
inputAddress=add, myAk=Apik)
res = requests.get(url)
json_data = json.loads(res.text)
if json_data['status'] == 0:
lat = json_data['result']['location']['lat'] # 是百度地图的经纬度不是WGS-84
lng = json_data['result']['location']['lng'] # 经度
else:
print("Error output!")
return json_data['status']
return lat, lng
def getlocation(lat,lng,apiK): #urllib 方法
ak = apiK
if lat=='':
return '该照片无GPS信息'
url = 'http://api.map.baidu.com/reverse_geocoding/v3/?callback=renderReverse&location=%s,%s&output=json&pois=1&ak=%s'%(str(lat), str(lng), ak)
req = urllib.request.urlopen(url)
res1 = req.read().decode("utf-8")
res = res1.replace("renderReverse&&renderReverse(", "")[:-1]
stradd = json.loads(res)
jsonResult = stradd.get('result')
formatted_address = jsonResult.get('formatted_address')
return formatted_address,stradd
def find_address_from_GPS(GPS, apikey): # requests 方法
"""
使用Geocoding API把经纬度坐标转换为结构化地址。
:param GPS:
:return:
"""
ak = apikey
if not GPS['经度']:
return '该照片无GPS信息'
lat, lng = GPS['纬度'], GPS['经度']
url = 'http://api.map.baidu.com/reverse_geocoding/v3/?callback=renderReverse&location=%s,%s&output=json&pois=1&ak=%s'%(str(lat),str(lng),ak)
req = requests.get(url)
res = req.text.replace("renderReverse&&renderReverse(", "")[:-1]
stradd = json.loads(res)
jsonResult = stradd.get('result')
formatted_address = jsonResult.get('formatted_address')
return formatted_address,stradd