【华为云技术分享】Python解析照片EXIF信息,获取坐标位置
1、背景
每張圖片都包含EXIF信息,它是可交換圖像文件的縮寫(xiě),是專(zhuān)門(mén)為數(shù)碼相機(jī)的照片設(shè)定的,可以記錄數(shù)碼照片的屬性信息和拍攝數(shù)據(jù)。EXIF可以附加于JPEG、TIFF、RIFF等文件之中,為其增加有關(guān)數(shù)碼相機(jī)拍攝信息的內(nèi)容和索引圖或圖像處理軟件的版本信息。總結(jié)來(lái)說(shuō)EXIF信息包含著該照片的拍照基本信息。
網(wǎng)上有很多的EXIF信息查看器,這里上傳一張十月一日和朋友去觀看的我和我的祖國(guó)這部電影的照片,沒(méi)有任何的標(biāo)志建筑背景,使用該工具進(jìn)行嘗試,可以很直觀的看到拍照時(shí)間、手機(jī)型號(hào)、地理位置等信息,具體如下所示:
接下來(lái)通過(guò)Python exifread庫(kù)函數(shù)解析照片,它可以解析圖片的EXIF信息,進(jìn)而依托百度地圖開(kāi)放平臺(tái)將GPS坐標(biāo)信息轉(zhuǎn)換為具體的位置,若想達(dá)到理想效果需要滿足以下幾點(diǎn)要求:
他人通過(guò)選擇原圖的方式,發(fā)送照片;
相機(jī)拍照時(shí),默認(rèn)設(shè)置了GPS定位;
圖片沒(méi)P過(guò);
2、云端部署
第1步:登錄百度地圖開(kāi)放平臺(tái),進(jìn)入控制臺(tái),這里說(shuō)明一下,百度地圖開(kāi)放平臺(tái)的定位有Web開(kāi)發(fā)、Android開(kāi)發(fā)
iOS開(kāi)發(fā)等不同的服務(wù),最終均會(huì)生成服務(wù)密鑰(AK),我們的Python調(diào)用就是依托于服務(wù)密鑰,所以創(chuàng)建什么業(yè)務(wù)影響不大,故不看開(kāi)發(fā)文檔也可以很方便開(kāi)發(fā)。
第2步:創(chuàng)建應(yīng)用,這里我選擇應(yīng)用類(lèi)型為:服務(wù)端(什么類(lèi)型都不影響接下來(lái)的操作,重點(diǎn)是獲取服務(wù)密鑰)。
這樣就操作完成了,使用獲取的服務(wù)密鑰就可以實(shí)現(xiàn)訪問(wèn)。
最后拓展學(xué)習(xí),看一下開(kāi)發(fā)文檔 ,主要是不同終端設(shè)備的SDK說(shuō)明文檔,有需要的小伙伴可以針對(duì)學(xué)習(xí)。
3、照片分析
依舊使用該照片做測(cè)試。
分析代碼如下:
1 import requests
2 import exifread
3
4 class GetPhotoInfo:
5 def __init__(self, photo):
6 self.photo = photo
7 # 百度地圖ak 請(qǐng)?zhí)鎿Q為自己申請(qǐng)的ak
8 self.ak = 'nYPs4LQ9a4VhVxj55AD69K6zgsRy9o4z'
9 self.location = self.get_photo_info()
10
11 def get_photo_info(self, ):
12 with open(self.photo, 'rb') as f:
13 tags = exifread.process_file(f)
14 try:
15 # 打印照片其中一些信息
16 print('拍攝時(shí)間:', tags['EXIF DateTimeOriginal'])
17 print('照相機(jī)制造商:', tags['Image Make'])
18 print('照相機(jī)型號(hào):', tags['Image Model'])
19 print('照片尺寸:', tags['EXIF ExifImageWidth'], tags['EXIF ExifImageLength'])
20 # 緯度
21 lat_ref = tags["GPS GPSLatitudeRef"].printable
22 lat = tags["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
23 lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600
24 if lat_ref != "N":
25 lat = lat * (-1)
26 # 經(jīng)度
27 lon_ref = tags["GPS GPSLongitudeRef"].printable
28 lon = tags["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
29 lon = float(lon[0]) + float(lon[1]) / 60 + float(lon[2]) / float(lon[3]) / 3600
30 if lon_ref != "E":
31 lon = lon * (-1)
32 except KeyError:
33 return "ERROR:請(qǐng)確保照片包含經(jīng)緯度等EXIF信息。"
34 else:
35 print("經(jīng)緯度:", lat, lon)
36 return lat, lon
37
38 def get_location(self):
39 url = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json'
40 '&coordtype=wgs84ll&location={},{}'.format(self.ak, *self.location)
41 response = requests.get(url).json()
42 status = response['status']
43 if status == 0:
44 address = response['result']['formatted_address']
45 print('詳細(xì)地址:', address)
46 else:
47 print('baidu_map error')
48
49
50 if __name__ == '__main__':
51 Main = GetPhotoInfo('im1.jpg')
52 Main.get_location()
雖然地理位置和實(shí)際看電影的地點(diǎn)存在一些偏差,但是基本信息是挺準(zhǔn)的,和EXIF信息查看器解析一致,分析結(jié)果如下:
作者:華為云特約供稿開(kāi)發(fā)者 不脫發(fā)的程序猿
總結(jié)
以上是生活随笔為你收集整理的【华为云技术分享】Python解析照片EXIF信息,获取坐标位置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ibm mq并发访问队列_消息队列之九问
- 下一篇: 华三交换机接口配置access_二层交换