iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
Software Development

學 Python 到底可以幹麻勒?系列 第 11

( Day 11 ) 讀取與修改圖片 Exif

  • 分享至 

  • xImage
  •  

這篇文章會介紹使用 Python 的 Pillow 和 piexif 第三方函式庫,實作可以讀取和修改圖片 Exif 的功能。

原文參考:讀取與修改圖片 Exif

Python 教學 - 讀取與修改圖片 Exif

什麼是 Exif

Exif 的中文名稱為「可交換圖檔格式」( Exchangeable image file format ),是專門為數位相機照片所設定的檔案格式,可以記錄數位相片的屬性資訊和拍攝資料,Exif 可以附加於 JPEG、TIFF、RIFF 等檔案之中,1998 年,更增加了對音訊檔的支援。

Exif 的內容為數位相機拍攝的資訊 ( 機型、時間、快門、光圈...等 )、索引圖或圖像處理軟體的資訊,不過由於 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 水平位置錯誤

Python 教學 - 讀取與修改圖片 Exif

安裝 piexif 和 Pillow

Pillow 函式庫是 Python 裡非常有名的圖形處理套件,如果使用 Colab 或 Anaconda Jupyter,已經內建 Pillow 函式庫,如果是本機環境可以輸入下方指令安裝 Pillow ( 根據個人電腦環境使用 pip、pip3 或 pipenv )。

pip install Pillow

piexif 是可以讀取與修改圖片 Exif 的套件,通常與 Pillow 搭配使用,輸入下方指令安裝 piexif ( 根據個人電腦環境使用 pip、pip3 或 pipenv )。

pip install piexif

讀取圖片 Exif

載入 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)

Python 教學 - 讀取與修改圖片 Exif

由於不同的照片或圖片,具有的 Exif 也不太相同,下方程式先按照上述的對照表建立一個 info 字典檔,再使用迴圈的方式根據字典檔查找 Exif 資料,如果有資料就將其印出,沒有資料資料就略過。

參考:for 迴圈字典 dictionaryin 檢查內容是否存在

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])

Python 教學 - 讀取與修改圖片 Exif

修改圖片 Exif

使用 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

Python 教學 - 讀取與修改圖片 Exif

刪除圖片 Exif

如果要刪除某張圖片的 Exif,只要執行下方這段程式即可,需注意的是,執行後不需要存檔的動作,直接就會刪除 Exif 資訊。

piexif.remove('./iphone.jpg')

Python 教學 - 讀取與修改圖片 Exif

小結

修改 Exif 可以做什麼事呢?通常會使用來修正拍照的時間 ( 當相機發生日期問題,照片時間錯亂 ),或在 Exif 裡加入自己的版權資訊,如果搭配 glob 函式庫,就能批次將 Exif 資訊加入大量的照片中。

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 10 ) 圖片的模糊化與銳利化
下一篇
( Day 12 ) 圖片轉文字 ( OCR 圖片字元辨識 )
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言