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', ...}
修改元数据:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> # 准备一个字典,包含你想修改的标签
>>> _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上运行。
批量消除图片元信息的脚本
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import piexif
import sys
import os
import redef remove_all_exif(image_names):for image_name in image_names:try:piexif.remove(image_name)print(image_name,"exif信息清除完毕")except Exception:passdef 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:passreturn image_namesdef main():image_names = get_images()remove_all_exif(image_names) passif __name__ == "__main__":main()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
