You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python3提取PNG中名为Settings的XML格式元数据?

如何用Python 3提取PNG中"Settings"标签的XML内容

嘿,我完全懂你想用Python替代R来搞定这个PNG元数据提取的需求——其实Python也有非常直接的工具能实现,不用啃太复杂的PNG底层知识!

首先,PNG里的自定义标签(比如你说的"Settings")一般是存在tEXt块(或者压缩版的zTXt块)里的,我们可以用两个常用库来提取:

方法1:用Pillow(推荐,更简便)

Pillow是Python最常用的图像处理库,它已经封装了PNG文本块的读取逻辑,甚至会自动处理压缩的zTXt内容。

步骤:

  1. 先安装依赖:
pip install pillow
  1. 编写提取代码:
from PIL import Image

# 替换成你的PNG文件路径
image_path = "your_target_image.png"

# 打开图片文件
with Image.open(image_path) as img:
    # 从图片的info中获取所有文本块,格式为[(关键字, 内容), ...]
    text_chunks = img.info.get('text', [])
    
    # 遍历查找"Settings"标签
    settings_content = None
    for key, content in text_chunks:
        if key.strip() == "Settings":
            settings_content = content
            break

# 输出结果
if settings_content:
    print("成功提取到Settings标签的XML内容:")
    print(settings_content)
else:
    print("未在图片中找到名为'Settings'的标签")

方法2:用pypng(更底层,适合需要自定义处理的场景)

如果你需要更深入地控制PNG块的处理,可以用pypng库,它能直接遍历PNG的所有数据块:

步骤:

  1. 安装依赖:
pip install pypng
  1. 编写提取代码:
import png

image_path = "your_target_image.png"

# 读取PNG文件并获取所有数据块
reader = png.Reader(filename=image_path)
chunks = reader.chunks()

settings_content = None
for chunk_type, chunk_data in chunks:
    # 只处理tEXt类型的块
    if chunk_type == b'tEXt':
        # tEXt块的结构是:关键字 + NULL分隔符 + 内容
        null_sep_index = chunk_data.find(b'\x00')
        if null_sep_index != -1:
            # 解码关键字和内容为字符串
            key = chunk_data[:null_sep_index].decode('utf-8')
            content = chunk_data[null_sep_index+1:].decode('utf-8')
            if key.strip() == "Settings":
                settings_content = content
                break
    # 如果是压缩的zTXt块,手动处理解压
    elif chunk_type == b'zTXt':
        null_sep_index = chunk_data.find(b'\x00')
        if null_sep_index != -1:
            key = chunk_data[:null_sep_index].decode('utf-8')
            if key.strip() == "Settings":
                import zlib
                # 跳过压缩方法字节,解压内容
                compressed_content = chunk_data[null_sep_index+2:]
                settings_content = zlib.decompress(compressed_content).decode('utf-8')
                break

if settings_content:
    print("成功提取到Settings标签的XML内容:")
    print(settings_content)
else:
    print("未在图片中找到名为'Settings'的标签")

补充说明:

  • 大部分情况下用Pillow就足够了,它会自动处理tEXt和zTXt块,不需要手动解压。
  • 你之前用R的png包提取,本质上也是读取这些PNG文本块,Python的这两个库做的是完全一样的事情,只是API风格不同而已。

内容的提问来源于stack exchange,提问作者Lorem Ipsum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:58:49