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 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 数据或其他形式的元数据,`Pillow` 和 `piexif` 是两个常用的库。通过这些工具可以读取并编辑图片中的信息: ```python from PIL import Image import piexif image_path = 'example.jpg' img = Image.open(image_path) # 获取现有的EXIF标签字典 exif_dict = piexif.load(img.info['exif']) # 更改某些特定字段的内容,比如GPS位置或者拍摄时间等 exif_dict['0th'][piexif.ImageIFD.Artist] = u"New Artist Name".encode('utf8') # 将更新后的字典转换回二进制字符串以便写入到新图象中去 new_exif_bytes = piexif.dump(exif_dict) # 创建一个新的Image对象并将新的Exif数据附加给它 output_image = img.copy() output_image.save("modified_" + image_path, exif=new_exif_bytes) ``` 这段代码展示了如何利用 Pillow 库加载一张 JPEG 格式的照片,并借助 piexif 来获取原始 Exif 信息,在此基础上做出相应调整之后再保存下来[^1]。 #### 音频文件元数据管理 当涉及到 MP3 或者其他格式的声音文档时,则可选用 Mutagen 这样的第三方模块来完成这项工作: ```python from mutagen.easyid3 import EasyID3 audio_file = '/path/to/your/song.mp3' metadata = EasyID3(audio_file) # 添加或更改艺术家名称 metadata['artist'] = ['The New Band'] # 更新专辑名 metadata['album'] = ['Best Album Ever'] # 设置歌曲标题 metadata['title'] = ['Awesome Song Title'] # 记得调用 save 方法使改动生效 metadata.save() ``` 上述脚本说明了怎样运用 Mutagen 的 easyID3 接口轻松地访问 ID3v2.x 版本下的各种属性,并对其进行必要的更正或是补充[^2]。 #### 视频文件元数据编辑 而对于多媒体影片而言,FFmpeg 提供了一个强大而灵活的选择方案;不过需要注意的是 FFmpeg 并不是一个纯 Python 实现的应用程序接口(API),而是需要依赖外部命令行工具来进行实际的任务执行。因此如果想在项目里面集成此功能的话可能还需要额外考虑跨平台兼容性等问题。 下面是一个简单的例子展示怎么通过子进程(subprocess)方式调用 ffmpeg 命令行工具实现对 MOV 文件添加自定义描述文字的操作: ```bash ffmpeg -i input.mov -metadata comment="This is a custom description." output.mov ``` 当然也可以把这条指令封装成一段 Python 函数方便后续重复调用: ```python import subprocess def set_video_metadata(input_filepath: str, output_filepath: str, key_value_pairs: dict[str, str]): """Set video metadata using FFmpeg.""" command_parts = ["ffmpeg", "-y", "-i", f"{input_filepath}"] for k, v in key_value_pairs.items(): command_parts.extend(["-metadata", f'{k}={v}']) command_parts.append(output_filepath) result = subprocess.run(command_parts, capture_output=True) if result.returncode != 0: raise RuntimeError(f'Error setting metadata:\n{result.stderr.decode()}') ``` 以上介绍了三种主要媒体类别下基于 Python 编程语言修改各自对应的元数据记录的具体方法[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值