python 分析图片获取拍摄时间和拍摄地点

最近发现的一个很简单,而且很有意思的一个项目,就是通过对手机拍摄照片的EXIF信息进行分析,可以获取到拍摄时间和拍摄时的GPS坐标。然后,通过地理逆编码,就可以把GPS对应的地点翻译出来。

有意思的用处

(1)对忘记信息的照片提供回忆线索。通过对拍摄时间地点的获取,很容易回忆出来当时拍摄时的情景。
(2)对你想知道的人进行定位。从别人那里要来一张图片,你就可以知道拍摄者的位置,拍摄时间。

依赖库

程序需要两个依赖库:exifread ,用来获取图片EXIF 信息; geopy,用来将GPS左边逆编码为地理信息。
地理信息的获取也可以在高德,百度,腾讯地图注册开发者获取api来完成,但是没有geopy方便。
可以通过安装两个依赖库

pip install exifread
pip install geopy

注意:

图片一定要是原图,一定要是原图,一定要是原图。(无它,美图拍出来的照片都不行)

获取图片 EXIF信息

以这个图片为例(这张图片已经不是原图了。。):
在这里插入图片描述
对于一张图片,其实直接电脑右键,再点击属性,然后点击详细信息,就会发现,其实图片的EXIF信息(时间,GPS坐标等)就已经能查看了。
在这里插入图片描述在这里插入图片描述
现在就是要借助exifread这个包把这些信息全都获取出来

import exifread
img=exifread.process_file(open('picture.jpg','rb'))
time=img['Image DateTime']
print(time)
latitude=img['GPS GPSLatitude']
print(latitude)
longitude=img['GPS GPSLongitude']
print(longitude)

img其实是一个字典,根据字典的key值找出对应时间,经纬度就可以了
只不过这个时候的经纬度还是GPS坐标的形式
输出的结果为:

2019:08:08 14:44:15
[34, 12, 9286743/200000]
[108, 57, 56019287/1000000]

这样,需要的信息就获取到了。
GPS坐标的理解:
以维度坐标为例:
34指的是度,12是分,9286743/200000 是秒,所以纬度就是:34度12分9286743/200000秒

格式化地理坐标

地理逆解码需要的坐标需要的是小数形式,所以要将上面的坐标进行转换,根据

1度=60分;1分=60秒

将GPS坐标进行转换

import exifread

def format_lati_long(data):
	list_tmp=str(data).replace('[', '').replace(']', '').split(',')
	list=[ele.strip() for ele in list_tmp]
	data_sec = int(list[-1].split('/')[0]) /(int(list[-1].split('/')[1])*3600)# 秒的值
	data_minute = int(list[1])/60
	data_degree = int(list[0])
	result=data_degree + data_minute + data_sec
	return result

img=exifread.process_file(open('picture.jpg','rb'))
latitude=format_lati_long(str(img['GPS GPSLatitude']))
print(latitude)
longitude=format_lati_long(str(img['GPS GPSLongitude']))
print(longitude)

程序运行的结果为:

34.21289825416667
108.96556091305555

这样,格式转换就完成了。

地理解码

最后一步是地理解码,直接上代码

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent='demo_of_gnss_help')
position = geolocator.reverse('34.21289825416667,108.96556091305555')#str格式才显示中国
print(position.address)

输出结果为:

大唐芙蓉园西门, 芙蓉西路 Fúróng West Rd, 曲江, 雁塔区, 雁塔区 (Yanta), 西安市, 陕西省, 710061, 中国

好吧,这是暑假出去玩的时候拍的照片。。
程序运行时可能会报warning,不用担心,没问题的,等结果就行。

重要的是下面两个问题:
首先,经纬度的顺序:我们通常的习惯是先经度后维度,例如:东经(E)xxx度北纬(N)xx度。但是在填写的时候要先纬度后经度,否则会报错;
经纬坐标的填写一定要是字符格式,不能是float格式,否则地点就是国外了。
例如:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
position = geolocator.reverse(34.21289825416667,108.96556091305555)#float格式才显示中国
print(position.address)

上面程序输出的结果为:

RN 109, sidi khalifa, daïra Marhoum, Sidi Bel Abbès - سيدي بلعباس, ⴷⵣⴰⵢⵔ الجزائر

或者通过高德,百度,腾迅地图的api解码地理信息

以高德为例:
api_key可以自己注册高德开发者模式获取,可以参考网上教程

import requests,json
api_key = 'xxxxxxxxxxxxxxxxxxxxxx'
url_get_position = 'https://restapi.amap.com/v3/geocode/regeo?output=JSON&location={}&key={}&radius=1000&extensions=base'
longitude=108.96556091305555
latitude=34.21289825416667
resp=requests.get(url_get_position.format(f'{longitude},{latitude}',api_key))
location_data = json.loads(resp.text)
address = location_data.get('regeocode').get('formatted_address')
print(address)

上面程序输出的结果为:

陕西省西安市雁塔区大雁塔街道金月汇(曲江店)曼蒂广场

地点其实都一样。

完整的代码可以去github上获取 代码链接

  • 16
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
要使用Python读取图片拍摄高度,可以使用exifread包中的process_file函数来获取图像的信息。首先,你需要安装exifread包,可以使用pip install exifread命令进行安装。接下来,你可以使用以下代码片段来读取图片拍摄高度: ``` import exifread img_path = r"bei_012744.jpg" f = open(img_path, 'rb') contents = exifread.process_file(f) f.close() altitude = contents['GPS GPSAltitude'].printable altitude = float(altitude.split('/')[0]) / float(altitude.split('/')[1]) print("拍摄高度:", altitude) ``` 在这个代码片段中,我们首先打开图片文件,并使用exifread.process_file函数来获取图像的信息。然后,通过contents['GPS GPSAltitude'].printable来获取图片拍摄高度。最后,我们将拍摄高度打印出来。 请注意,这只是一个示例代码,你需要将img_path变量替换为你自己的图片路径。另外,由于exifread返回的拍摄高度是一个字符串,我们需要将其转换为浮点数来获得实际的高度值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python读取图片属性信息](https://blog.csdn.net/weixin_34910922/article/details/123340837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值