exifread:讀取照片中的 exif 信息


今天對象給我發了一張照片,是真的對象,不是 new 出來的,然后我把照片的拍攝地點和拍攝時間提取了出來,收獲了一個 666。進入正題,現如今的智能手機在拍攝照片時,都含有 Exif(可交換圖像文件格式,Exchangeable image file format)信息,通過該信息可以獲取拍照時的位置、時間,以及手機品牌等信息。那么下面就看看如何使用 Python 去獲取這些信息吧。

Python 想要讀取 Exif 信息需要安裝一個第三方庫,直接 pip install exifread 即可。

import exifread

with open("1.jpg", 'rb') as f:
    # 直接可以拿到里面的信息,內容非常多
    exif = exifread.process_file(f)

# 這里我們選一些常用的,里面的 value 我們需要轉成字符串
# 不轉成字符串的話看起來會比較費勁
print("圖片寬度:", str(exif["Image ImageWidth"]))
print("圖片高度:", str(exif["Image ImageLength"]))
print("手機品牌:", str(exif["Image Make"]))
print("手機型號:", str(exif["Image Model"]))
print("拍攝時間:", str(exif["Image DateTime"]))
print("經度:", str(exif["GPS GPSLongitude"]))
print("東經還是西經:", str(exif["GPS GPSLongitudeRef"]))
print("緯度:", str(exif["GPS GPSLatitude"]))
print("南緯還是北緯:", str(exif["GPS GPSLatitudeRef"]))
"""
圖片寬度: 3968
圖片高度: 2976
手機品牌: HUAWEI
手機型號: EML-AL00
拍攝時間: 2021:07:08 19:52:23
經度: [116, 28, 5973999/100000]
東經還是西經: E
緯度: [39, 59, 1255371/200000]
南緯還是北緯: N
"""

還是比較簡單的,但是里面的經度和緯度比較怪,我們還需要再對其轉化一下。

lng = str(exif["GPS GPSLongitude"])  # 經度
lat = str(exif["GPS GPSLatitude"])  # 緯度
print(lng)  # [116, 28, 5973999/100000]
print(lat)  # [39, 59, 1255371/200000]

# 轉成列表
lng = lng[1: -1].replace("/", ",").split(",")
lat = lat[1: -1].replace("/", ",").split(",")
print(lat)  # ['39', ' 59', ' 1255371', '200000']
print(lng)  # ['116', ' 28', ' 5973999', '100000']

# 然后得到具體的經緯度
lng = float(lng[0]) + float(lng[1]) / 60 + float(lng[2]) / float(lng[3]) / 3600
lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600
print(lng)  # 116.48326110833334
print(lat)  # 39.98507690416667

這里得到的經緯度永遠是正數,如果是西經,那么得到的經度要乘上 -1;同理如果是南緯,那么維度要乘上 -1。

然后我們可以將上述代碼封裝一下:

import sys
from pprint import pprint
import exifread


def extract_exif(file_path: str):
    with open(file_path, 'rb') as f:
        exif = exifread.process_file(f)

    if not exif:
        return "該照片無法解析出相關信息"

    info = {
        "圖片寬度": str(exif["Image ImageWidth"]),
        "圖片高度": str(exif["Image ImageLength"]),
        "手機品牌": str(exif["Image Make"]),
        "手機型號": str(exif["Image Model"]),
        "拍攝時間": str(exif["Image DateTime"]),
    }

    lng = str(exif["GPS GPSLongitude"])[1: -1].replace("/", ",").split(",")
    lat = str(exif["GPS GPSLatitude"])[1: -1].replace("/", ",").split(",")
    info["經度"] = float(lng[0]) + float(lng[1]) / 60 + float(lng[2]) / float(lng[3]) / 3600
    info["緯度"] = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600

    if str(exif["GPS GPSLongitudeRef"]) != "E":
        # 不是東經,那么經度乘上 -1,
        info["經度"] = info["經度"] * -1
    if str(exif["GPS GPSLatitudeRef"]) != "N":
        # 不是北緯,那么緯度乘上 -1
        info["緯度"] = info["緯度"] * -1

    return info


if __name__ == '__main__':
    args = sys.argv
    if len(args) < 2:
        pprint("請輸入圖片路徑")
    pprint(extract_exif(args[1]))

這里我們需要注意的是,並非所有的照片都能夠進行解析,必須是攜帶 exif 信息的原始圖片。如果中間進行了壓縮、或者 P 圖,那么就無法識別了。

當然像一些社交平台也會專門針對 exif 進行處理,比如微信,你發在朋友圈的圖片會自動壓縮,所以是不會暴露位置信息的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM