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

如何用Pillow保存带有Comment的JPEG图片?

解决Pillow保存JPEG时丢失COM注释的问题

方法1:使用Pillow内置的comment参数(推荐)

Pillow保存JPEG时不会自动从img.info中继承注释,需要显式指定comment参数才能保留或添加COM段注释,这是最简洁的实现方式。

保留已有图片的注释

from PIL import Image

# 打开带注释的示例图片
img = Image.open("example.jpg")
# 提取原有注释
existing_comment = img.info.get("comment")

# 保存时显式传入comment参数
img.save("saved_with_comment.jpg", comment=existing_comment)

# 验证注释是否保留
new_img = Image.open("saved_with_comment.jpg")
print(new_img.info["comment"])  # 正常输出原有注释

给Numpy生成的新图片添加注释

import numpy as np
from PIL import Image

# 从Numpy数组生成图像
np_array = np.random.randint(0, 255, size=(200, 200, 3), dtype=np.uint8)
img = Image.fromarray(np_array)

# 自定义ASCII格式的注释
custom_comment = "Third-party app metadata: v1.0.0"

# 保存时添加注释
img.save("new_image_with_comment.jpg", comment=custom_comment)

# 验证
new_img = Image.open("new_image_with_comment.jpg")
print(new_img.info["comment"])  # 输出自定义注释

方法2:直接操作JPEG二进制插入COM段(兼容特殊场景)

如果Pillow的comment参数无法满足需求(如旧版本兼容性问题),可以直接修改JPEG文件的二进制结构,在文件开头插入COM段。JPEG的COM段格式为:0xFF 0xFE(标记码) + 2字节大端长度(注释内容的字节数) + ASCII注释内容。

def add_jpeg_comment(input_jpg_path, output_jpg_path, comment):
    # 读取原始JPEG文件二进制数据
    with open(input_jpg_path, "rb") as f:
        jpg_data = f.read()
    
    # 验证是否为合法JPEG(以SOI标记FFD8开头)
    soi_marker = b"\xFF\xD8"
    if not jpg_data.startswith(soi_marker):
        raise ValueError("输入文件不是合法的JPEG格式")
    
    # 构造COM段
    comment_bytes = comment.encode("ascii")
    # 注释长度(2字节大端,对应注释内容的字节数)
    comment_len = len(comment_bytes).to_bytes(2, byteorder="big")
    com_segment = b"\xFF\xFE" + comment_len + comment_bytes
    
    # 在SOI标记后插入COM段
    modified_jpg_data = soi_marker + com_segment + jpg_data[2:]
    
    # 写入新文件
    with open(output_jpg_path, "wb") as f:
        f.write(modified_jpg_data)

# 使用示例
# 先保存无注释的临时图片
img.save("temp_no_comment.jpg")
# 给临时图片添加注释
add_jpeg_comment("temp_no_comment.jpg", "final_with_comment.jpg", "Custom metadata for third-party")

# 验证
new_img = Image.open("final_with_comment.jpg")
print(new_img.info["comment"])

关键说明

  • JPEG的COM段是独立于EXIF的元数据段,仅支持ASCII字符串,以0xFF 0xFE标记开头。
  • 请勿使用img.save(..., info=img.info),因为Pillow的JPEG保存逻辑不会自动解析info字典中的comment字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:20:38