读取与修改图片 Exif
这篇文章会介绍使用 Python 的 Pillow 和 piexif 第三方函数库,实作可以读取和修改图片 Exif 的功能。
- 本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
- 使用 Colab 操作需要连动 Google 云端硬盘,请参考:连动 Google Drive
什么是 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 | 水平位置错误 |
安装 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 后,可以直接使用下方程序打开图片,读取图片信息。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
import piexif
info = piexif.load("./oxxostudio.jpg") # 使用 piexif 讀取圖片
print(exif) # 顯示圖片資訊
print(info["Exif"]) # 顯示圖片 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)
由于不同的照片或图片,具有的 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])
修改图片 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
删除图片 Exif
如果要删除某张图片的 Exif,只要执行下方这段程序即可,需注意的是,执行后不需要存档的动作,直接就会删除 Exif 信息。
piexif.remove('./iphone.jpg')
小结
修改 Exif 可以做什么事呢?通常会使用来修正拍照的时间 ( 当相机发生日期问题,照片时间错乱 ),或在 Exif 里加入自己的版权信息,如果搭配 glob 函数库,就能批次将 Exif 信息加入大量的照片中。
微信扫码关注
抖音扫码关注