python修改png图片元数据中text信息,并修改为冒号分隔

目录

  • 背景
  • 解决办法
    • 生成png图片
    • 修改png元数据text信息
    • 修改png元数据数据键值对分隔符
  • 小结

背景

在一个项目的过程中,需要matplotlib生成图片,并且生成图片之后,要把元数据信息中的text修改为指定格式,在后期过程中,要求text键值对中间的分割符是冒号(:)。此过程查找资料解决问题不容易,特此记录。

解决办法

在项目进行过程中,想过直接修改生成的text信息,但是实在是没用找到相关资料。只能记录一下 我目前实现的逻辑。

第一 用matplotlib生成图片
第二 使用PIL库中的 Image, PngImagePlugin 库修改text中的信息
因为第二使用此库生成的文件中,text信息中的键值对默认是使用\00作为分隔符,不符合要求需要修改成使用":“分割。因此需要第三步。
第三 使用pypng库修改第二步中生成文件中的键值对分割符修改为”:"

生成png图片

用matplotlib生成png图片

plt.savefig(self.filename)

修改png元数据text信息

from PIL import Image, PngImagePlugin

data = {}
with open('./data/header.txt', 'r') as file:
    for line in file:
        line = line.strip()  # 去除首尾空格和换行符
        if line:  # 确保不是空行
            key, value = line.split(':')
            data[key] = value
try:
    img = Image.open(self.filename)
except IOError:
    exit()
png_info = PngImagePlugin.PngInfo()
for key in data.keys():
    png_info.add_text(key, data[key])
img.save(self.filename, pnginfo=png_info)

修改png元数据数据键值对分隔符

import pypng
def my_generator(chunks):
    for key, value in chunks:
        if key == b"tEXt":
            if b"\x00" in value:
                value = value.replace(b"\x00", b":")
        yield (key, value)
im = png.Reader(filename)
chunks = im.chunks()
with open(filename, 'rb+') as f:
    png.write_chunks(f, chunks=my_generator(chunks))

小结

  • 项目完成后我觉得可能直接使用pypng库应该可以直接完成想要的效果。但是由于修改分隔符这个是后提出来的 ,就没用进行更改。
  • 觉得在pypng库中 上面生成迭代器的时候,略作修改应该就能实现所达到的功能 不需要使用第二部了,由于pypng学习资料比较少,所以只是猜测。没有进行验证。

你可能感兴趣的:(python,开发语言)