這篇文章會介紹使用 Python 的 Pillow 和 piexif 第三方函式庫,實作可以讀取和修改圖片 Exif 的功能。
原文參考:讀取與修改圖片 Exif
- 本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
- 使用 Colab 操作需要連動 Google 雲端硬碟,請參考:連動 Google Drive
Exif 的中文名稱為「可交換圖檔格式」( Exchangeable image file format ),是專門為數位相機照片所設定的檔案格式,可以記錄數位相片的屬性資訊和拍攝資料,Exif 可以附加於 JPEG、TIFF、RIFF 等檔案之中,1998 年,更增加了對音訊檔的支援。
Exif 的內容為數位相機拍攝的資訊 ( 機型、時間、快門、光圈...等 )、索引圖或圖像處理軟體的資訊,不過由於 Exif 資訊可以任意編輯,因此只有參考的功能。
讀取 Exif 後,會得到一個由許多的鍵、值和 tuple 所組成的字典檔 ( dict ),下方列出常見的對照表 ( 不一定每張相片都有這些資訊,可能全都有,也可能全都沒有或只有部分 )。
參考:Exif Version 2.3 pdf ( 第 46 頁 )
type | key | 說明 |
---|---|---|
0th | 271 | 製作 |
0th | 272 | 機型 |
0th | 282 | dpi 高度 |
0th | 283 | dpi 寬度 |
0th | 305 | 應用程式 |
0th | 306 | 修改日期 |
Exif | 316 | 機型 |
Exif | 33434 | 曝光時間 ( 快門 ) |
Exif | 33437 | 焦距比數 |
Exif | 34855 | ISO 值 |
Exif | 36867、36868 | 建立日期 |
Exif | 36880、36881、36882 | 時區 |
Exif | 36880、36881、36882 | 時區 |
Exif | 37385 | 閃光燈 ( 9 開啟,16 關閉,32 無閃光功能 ) |
Exif | 40962 | 寬度像素 |
Exif | 40963 | 高度像素 |
Exif | 42035 | 鏡頭組成廠牌 |
Exif | 42036 | 鏡頭機型 |
1st | 282 | x 解析度 |
1st | 283 | y 解析度 |
GPS | 2 | 北緯 |
GPS | 4 | 東經 |
GPS | 5 | 標高 ( 內容數字相除 ) |
GPS | 17 | 目標方位 ( 內容數字相除 ) |
GPS | 24 | 影像方向 ( 內容數字相除 ) |
GPS | 31 | 水平位置錯誤 |
Pillow 函式庫是 Python 裡非常有名的圖形處理套件,如果使用 Colab 或 Anaconda Jupyter,已經內建 Pillow 函式庫,如果是本機環境可以輸入下方指令安裝 Pillow ( 根據個人電腦環境使用 pip、pip3 或 pipenv )。
pip install Pillow
piexif 是可以讀取與修改圖片 Exif 的套件,通常與 Pillow 搭配使用,輸入下方指令安裝 piexif ( 根據個人電腦環境使用 pip、pip3 或 pipenv )。
pip install piexif
載入 piexif 和 Pillow 後,撰寫下方程式,執行後就會印出 iphone.jpg 的 Exif 資訊,從中可以看到資訊裡有 0th、Exif、1st、GPS...等資訊。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
import piexif
img = Image.open("./oxxostudio.jpg") # 使用 PIL Image 開啟圖片
exif = piexif.load(img.info["exif"]) # 使用 piexif 讀取圖片 Exif 資訊
print(exif)
由於不同的照片或圖片,具有的 Exif 也不太相同,下方程式先按照上述的對照表建立一個 info 字典檔,再使用迴圈的方式根據字典檔查找 Exif 資料,如果有資料就將其印出,沒有資料資料就略過。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
import piexif
img = Image.open("./oxxostudio.jpg")
exif = piexif.load(img.info["exif"])
# 建立字典對照表
info = {
'0th':[271, 272, 282, 283, 305, 306, 316],
'Exif':[33434, 33437, 34855, 36867, 36868, 36880, 36881, 36882, 40962, 40963, 42035 ,42036],
'1st':[282, 283],
'GPS':[2, 4, 5, 17, 24, 31]
}
# 根據對照表,印出照片 exif 裡的資訊 ( 有就印出,沒有就略過 )
for i in info:
for j in info[i]:
if j in exif[i]:
print(j, ':', exif[i][j])
使用 piexif 的 dump 功能,就能修改圖片的 Exif,修改後再存檔時,指定要加入的 Exif,就會將新的 Exif 加入圖片中,需要注意的是,圖片 Exif 裡的字串都是以「二進位」表示 ( 開頭有 b ),所以如果要修改也必須改成二進位的方式 ( 開頭加上b )。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
import piexif
img = Image.open("./oxxostudio.jpg")
exif = piexif.load(img.info["exif"])
exif["0th"][305] = b'OXXO.STUDIO' # 修改編輯軟體
exif["0th"][306] = b'2020:01:01 00:00:00' # 修改編輯時間
exif["Exif"][36867] = b'2020:01:01 00:00:00' # 加入檔案建立時間
exif["Exif"][36868] = b'2020:01:01 00:00:00' # 加入檔案建立時間
exif_new = piexif.dump(exif) # 更新 Exif
img.save("./iphone-edit.jpg", exif = exif_new ) # 另存新檔並加入 Exif
如果要刪除某張圖片的 Exif,只要執行下方這段程式即可,需注意的是,執行後不需要存檔的動作,直接就會刪除 Exif 資訊。
piexif.remove('./iphone.jpg')
修改 Exif 可以做什麼事呢?通常會使用來修正拍照的時間 ( 當相機發生日期問題,照片時間錯亂 ),或在 Exif 裡加入自己的版權資訊,如果搭配 glob 函式庫,就能批次將 Exif 資訊加入大量的照片中。
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^