python获取照片EXIF信息(拍摄地址、拍摄时间、经纬度等)

EXIF信息

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
这是从以前的相机遗留下来的,现在手机、相机都会有这个信息,这个信息包括光圈、曝光度、GPS信息、拍摄机器、拍摄时间等等。这个信息是相当详细了。只要是拍摄的照片都有这个信息,所以这个信息也是有泄露个人隐私的风险。在不法分子眼里,这就是有价值的信息啊,都是钱啊!

社交圈的图片有泄露信息的风险吗?

你能想到,那腾讯新浪这些大厂的大佬程序员也能想到的。所以呢,经过实测,微博里发的图片、朋友圈发的图片、QQ空间的图片、都是经过处理的,exif信息早就被抹除了。微信发的图片,不是发送的原图,那就也就被抹除了。一般,图片没有被经过二次处理,都是有exif信息的,没有经过处理的原图都是有exif信息的。总结一下,微信发送的原图是有exif信息;QQ发送的图片,有exif信息,其他未经过二次处理的图片也是有exif信息的。

exif信息展示

项目 信息(举例)
制造厂商 Canon
相机型号 Canon EOS-1Ds Mark III
图象方向 正常(upper-left)
图象分辨率X 300
图象分辨率Y 300
分辨率单位 dpi
Software AdobePhotoshopCSMacintosh
最后异动时间 2005:10:06 12:53:19
YCbCrPositioning 2
曝光时间 0.00800 (1/125) sec
光圈值 F22
拍摄模式 光圈优先
ISO感光值 100
Exif信息版本 30,32,32,31
图象拍摄时间 2005:09:25 15:00:18
图象存入时间 2005:09:25 15:00:18
曝光补偿(EV±) 0
测光模式 点测光(Spot)
闪光灯 关闭
镜头实体焦长 12 mm
Flashpix版本 30,31,30,30
图象色域空间 sRGB
图象尺寸X 5616pixel
图象尺寸Y 3744 pixel

这是百度百科的数据,当然这只是一部分,还有GPS定位,都会有展示的,所以还是挺重要的,要是手机拍摄,还有手机厂商、手机型号等信息。

python代码获取EXIF信息,还有GPS定位转换为地址的代码

import exifread
import json
import urllib.request

f = open('1.jpg', 'rb')

tags = exifread.process_file(f)
print(tags)
# 打印所有照片信息,会以键值对的方法保存
for tag in tags.keys():
    print("Key: {0}, value {1}".format(tag, tags[tag]))

# 打印照片其中一些信息
print('拍摄时间:', tags['EXIF DateTimeOriginal'])
print('照相机制造商:', tags['Image Make'])
print('照相机型号:', tags['Image Model'])
print('照片尺寸:', tags['EXIF ExifImageWidth'], tags['EXIF ExifImageLength'])


def getLatOrLng(refKey, tudeKey):
	"""
	获取经度或纬度
	"""
    if refKey not in tags:
        return None
    ref = tags[refKey].printable
    LatOrLng = tags[tudeKey].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
    print(LatOrLng)
    LatOrLng = float(LatOrLng[0]) + float(LatOrLng[1]) / 60 + float(LatOrLng[2]) / 3600
    if refKey == 'GPS GPSLatitudeRef' and tags[refKey].printable != "N":
        LatOrLng = LatOrLng * (-1)
    if refKey == 'GPS GPSLongitudeRef' and tags[refKey].printable != "E":
        LatOrLng = LatOrLng * (-1)
    return LatOrLng


# 调用百度地图API通过经纬度获取位置
def getlocation(lat, lng):
	"""
	exif里面的经纬度是度分秒形式传入的,需要转换为小数形式,然后根据传入的经纬度,调用百度接口去查询详细地址
	"""
    url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=百度API的AK信息,需要自己去申请&output=json&coordtype=wgs84ll&language_auto=1&extensions_town=true&location=" + lat + "," + lng
    req = urllib.request.urlopen(url)
    res = req.read().decode("utf-8")
    print(res)
    str1 = json.loads(res)
    jsonResult = str1.get('result')
    formatted_address = jsonResult.get('formatted_address')
    return formatted_address


lat = getLatOrLng('GPS GPSLatitudeRef', 'GPS GPSLatitude')  # 纬度
lng = getLatOrLng('GPS GPSLongitudeRef', 'GPS GPSLongitude')  # 经度
print('纬度:{0} 经度:{1}'.format(lat, lng))

location = getlocation(str(lat), str(lng))
print('位置:{0}'.format(location))

最后声明

如果有不合适的地方,请指正。代码有参考LLand520博主的文章
https://blog.csdn.net/LLand520/article/details/101347077?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
如有侵权等事宜,请联系我,即刻删除。

你可能感兴趣的:(python代码)