python 修改、讀取圖片元數據


 

圖片元數據

圖片元數據(metadata)是嵌入到圖片文件中的一些標簽。比較像文件屬性,但是種類繁多。常見的幾種標准有:

EXIF:通常被數碼相機在拍攝照片時自動添加,比如相機型號、鏡頭、曝光、圖片尺寸等信息。
IPTC:比如圖片標題、關鍵字、說明、作者、版權等信息。
XMP:由Adobe公司制定標准,以XML格式保存。用PhotoShop等Adobe公司的軟件制作的圖片通常會攜帶這種信息。

 

修改、讀取圖片元數據

Exiv2

Exiv2的網站:https://www.exiv2.org/index.html
Exiv2支持的元數據列表:https://www.exiv2.org/metadata.html
Exiv2支持的圖片格式:https://dev.exiv2.org/projects/exiv2/wiki/Supported_image_formats

Exiv2github鏈接:https://github.com/LeoHsiao1/pyexiv2

讀取元數據:

>>> from pyexiv2 import Image

>>> i = Image("tests/1.jpg")    # 登記圖片路徑
>>> i.read_exif()                # 讀取元數據,這會返回一個字典
{'Exif.Image.DateTime': '2019:06:23 19:45:17', 'Exif.Image.Artist': 'TEST', 'Exif.Image.Rating': '4', ...}
>>> i.read_iptc()
{'Iptc.Envelope.CharacterSet': '\x1b%G', 'Iptc.Application2.ObjectName': 'TEST', 'Iptc.Application2.Keywords': 'TEST', ...}
>>> i.read_xmp()
{'Xmp.dc.format': 'image/jpeg', 'Xmp.dc.rights': 'lang="x-default" TEST', 'Xmp.dc.subject': 'TEST', ...}

修改元數據:

>>> # 准備一個字典,包含你想修改的標簽
>>> _dict = {"Xmp.xmp.CreateDate": "2019-06-23T19:45:17.834",   # 設置這個標簽的值
...          "Xmp.xmp.Rating": ""}  # 顯式地設置一個空字符串來刪除該標簽
}
>>> i.modify_xmp(_dict)                # 執行修改
>>> xmp_dict = i.read_xmp()         # 重新讀取元數據
>>> xmp_dict["Xmp.xmp.CreateDate"]
'2019-06-23T19:45:17.834'           # 這個標簽已經被修改了
>>> xmp_dict["Xmp.xmp.Rating"]
KeyError: 'Xmp.xmp.Rating'          # 這個標簽已經被刪除了

# 使用 i.modify_exif() 、i.modify_iptc() 的方法同理

Piexif 

五個功能:

load(filename) -以dict的形式獲取exif數據。
dump(exif_dict) -以字節為單位獲取exif 以使用JPEG保存。
insert(exif_bytes,filename) -將exif插入JPEG。
remove(filename) -從JPEG移除exif。
移植(文件名,文件名) -將exif從JPEG移植到JPEG。
1.Piexif不依賴任何第三個庫。
2.在Python 2.7、3.3、3.4、3.5、3.6,pypy和pypy3上進行了測試。Piexif甚至可以在IronPython上運行。Piexif與操作系統無關,可以在GoogleAppEngine上運行。

批量消除圖片元信息的腳本

import piexif
import sys
import os
import re

def remove_all_exif(image_names):
    for image_name in image_names:
        try:
            piexif.remove(image_name)
            print(image_name,"exif信息清除完畢")
        except Exception:
            pass


def get_images():
    all_file_names = os.listdir()
    image_names = list()
    for file_name in all_file_names:
        if re.match(r".*\.(jpg|JPG|png)",file_name):
            image_names.append(file_name)
            print("已經將",file_name,"添加到列表!")
        else:
            pass
    return image_names


def main():
    image_names = get_images()
    remove_all_exif(image_names)
    
    pass


if __name__ == "__main__":
    main()

 

 

參考:Python讀寫圖片元數據(EXIF、IPTC、XMP)

 


免責聲明!

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



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