Qwen-Image-2512实战教程:为生成图添加版权水印与EXIF元数据的后处理脚本

1. 为什么需要后处理脚本

当你用Qwen-Image-2512生成精美的图片后,可能会遇到这样的问题:图片分享出去后,别人不知道这是AI生成的,或者不知道创作者是谁。更实际的是,如果你用这些图片进行商业创作,没有版权信息很容易引发纠纷。

这就是后处理脚本的价值所在——它能在图片生成后自动添加两大关键信息:

  • 版权水印:在图片角落添加半透明的创作者信息,既不影响美观又能声明版权
  • EXIF元数据:在图片文件内部嵌入创作者、生成时间、使用模型等信息

想象一下,你为客户生成了一套产品概念图,每张图片都自动带有你的工作室名称和生成时间戳,看起来专业又省心。

2. 环境准备与脚本部署

2.1 安装所需库

首先确保你的Python环境中有这些基础库:

pip install Pillow piexif
  • Pillow:Python最常用的图像处理库,负责水印添加
  • piexif:专门处理EXIF元数据的轻量级库

2.2 创建后处理脚本

新建一个Python文件image_postprocessor.py,写入以下基础代码:

from PIL import Image, ImageDraw, ImageFont
import piexif
from datetime import datetime
import os

class ImagePostProcessor:
    def __init__(self):
        self.watermark_text = "Generated by Qwen-Image-2512"
        self.creator = "Your Name/Studio"
        
    def process_image(self, image_path, output_path=None):
        """主处理函数"""
        if output_path is None:
            output_path = image_path
            
        # 添加水印
        self.add_watermark(image_path, output_path)
        
        # 添加EXIF数据
        self.add_exif_data(output_path)
        
        print(f"处理完成: {output_path}")

这样就搭建好了脚本的基本框架,接下来我们分别实现水印和EXIF功能。

3. 添加版权水印实战

3.1 基础水印实现

在刚才的类中添加水印方法:

def add_watermark(self, input_path, output_path):
    """添加文字水印到图片右下角"""
    try:
        # 打开图片
        image = Image.open(input_path)
        
        # 创建绘图对象
        draw = ImageDraw.Draw(image)
        
        # 尝试使用系统字体,如果失败则使用默认字体
        try:
            font = ImageFont.truetype("Arial", 20)
        except:
            font = ImageFont.load_default()
        
        # 获取图片尺寸和水印文本尺寸
        width, height = image.size
        text_width = draw.textlength(self.watermark_text, font=font)
        
        # 计算水印位置(右下角,留10像素边距)
        position = (width - text_width - 10, height - 30)
        
        # 添加半透明水印(颜色、位置、字体)
        draw.text(position, self.watermark_text, fill=(255, 255, 255, 128), font=font)
        
        # 保存图片
        image.save(output_path)
        
    except Exception as e:
        print(f"添加水印失败: {e}")

这个水印功能有几个实用特点:

  • 自动定位到图片右下角,不影响主体内容
  • 使用半透明白色文字,在各种背景色上都清晰可见
  • 有简单的错误处理,避免因为字体问题导致整个脚本失败

3.2 高级水印定制

如果你想要更专业的水印效果,可以试试这个增强版本:

def add_advanced_watermark(self, input_path, output_path):
    """增强版水印:带背景框和自定义样式"""
    image = Image.open(input_path).convert("RGBA")
    
    # 创建水印图层
    watermark = Image.new("RGBA", image.size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(watermark)
    
    # 使用更美观的字体(如果可用)
    try:
        font = ImageFont.truetype("Arial", 16)
    except:
        font = ImageFont.load_default()
    
    text = f"© {self.creator} | Qwen-Image-2512"
    bbox = draw.textbbox((0, 0), text, font=font)
    text_width = bbox[2] - bbox[0]
    text_height = bbox[3] - bbox[1]
    
    # 计算位置(右下角)
    x = image.width - text_width - 15
    y = image.height - text_height - 15
    
    # 绘制半透明背景
    draw.rectangle(
        [x - 5, y - 5, x + text_width + 5, y + text_height + 5],
        fill=(0, 0, 0, 128)  # 半透明黑色背景
    )
    
    # 绘制文字
    draw.text((x, y), text, fill=(255, 255, 255, 200), font=font)
    
    # 合并水印和原图
    watermarked = Image.alpha_composite(image, watermark)
    watermarked = watermarked.convert("RGB")
    watermarked.save(output_path)

这种水印看起来更专业,带有的背景框让文字在任何背景下都清晰可读。

4. 添加EXIF元数据详解

4.1 基础EXIF信息添加

EXIF是嵌入在图片文件里的"隐形"信息,不会影响图片显示,但能用专业软件查看:

def add_exif_data(self, image_path):
    """添加EXIF元数据到图片"""
    try:
        # 创建基础的EXIF数据
        exif_dict = {
            "0th": {
                piexif.ImageTag.Software: b"Qwen-Image-2512 Generator",
                piexif.ImageTag.Artist: self.creator.encode(),
            },
            "Exif": {
                piexif.ExifTag.DateTimeOriginal: datetime.now().strftime("%Y:%m:%d %H:%M:%S").encode(),
            }
        }
        
        # 转换为EXIF字节数据
        exif_bytes = piexif.dump(exif_dict)
        
        # 添加到图片
        image = Image.open(image_path)
        image.save(image_path, exif=exif_bytes)
        
    except Exception as e:
        print(f"添加EXIF数据失败: {e}")

4.2 完整EXIF信息方案

为了让元数据更加完整,我们可以添加更多详细信息:

def add_complete_exif_data(self, image_path, prompt=""):
    """完整的EXIF信息方案"""
    # 准备详细的数据
    exif_dict = {
        "0th": {
            piexif.ImageTag.Make: b"AI Generated",
            piexif.ImageTag.Model: b"Qwen-Image-2512",
            piexif.ImageTag.Software: b"Qwen-Image-2512 Generator v1.0",
            piexif.ImageTag.Artist: self.creator.encode(),
            piexif.ImageTag.Copyright: f"Copyright {datetime.now().year} {self.creator}".encode(),
        },
        "Exif": {
            piexif.ExifTag.DateTimeOriginal: datetime.now().strftime("%Y:%m:%d %H:%M:%S").encode(),
            piexif.ExifTag.DateTimeDigitized: datetime.now().strftime("%Y:%m:%d %H:%M:%S").encode(),
        },
        "1st": {},
        "thumbnail": None
    }
    
    # 添加生成提示词(如果提供)
    if prompt:
        user_comment = f"Prompt: {prompt}".encode()
        exif_dict["Exif"][piexif.ExifTag.UserComment] = user_comment
    
    try:
        exif_bytes = piexif.dump(exif_dict)
        image = Image.open(image_path)
        
        # 保存时保留原有质量
        image.save(image_path, exif=exif_bytes, quality=95)
        
    except Exception as e:
        print(f"添加详细EXIF失败: {e}")

这样添加后,任何人用EXIF查看器都能看到完整的生成信息。

5. 完整脚本与自动化集成

5.1 完整的后处理脚本

把前面的代码整合起来:

from PIL import Image, ImageDraw, ImageFont
import piexif
from datetime import datetime
import os

class QwenImagePostProcessor:
    def __init__(self, creator="My AI Studio"):
        self.creator = creator
        self.watermark_text = f"Generated by {creator}"
    
    def process_single_image(self, image_path, output_path=None, prompt=""):
        """处理单张图片"""
        if output_path is None:
            output_path = image_path
            
        print(f"处理图片: {os.path.basename(image_path)}")
        
        # 依次处理
        self.add_watermark(image_path, output_path)
        self.add_complete_exif_data(output_path, prompt)
        
        return output_path
    
    def process_directory(self, directory_path, prompt=""):
        """处理整个目录的图片"""
        supported_formats = ('.jpg', '.jpeg', '.png', '.webp')
        
        for filename in os.listdir(directory_path):
            if filename.lower().endswith(supported_formats):
                image_path = os.path.join(directory_path, filename)
                self.process_single_image(image_path, prompt=prompt)
    
    # 这里包含前面所有的add_watermark、add_advanced_watermark、
    # add_exif_data、add_complete_exif_data方法
    # ...(为了节省篇幅,实际代码请参考前面章节)

# 使用示例
if __name__ == "__main__":
    processor = QwenImagePostProcessor(creator="我的AI创作工作室")
    
    # 处理单张图片
    processor.process_single_image("生成的图片.jpg", prompt="一只可爱的猫咪")
    
    # 或者处理整个文件夹
    # processor.process_directory("./生成的图片/", prompt="系列插画")

5.2 与Qwen-Image-2512集成

如果你想要完全自动化,可以在生成图片后立即调用后处理:

def generate_with_watermark(prompt_text):
    """模拟生成并自动添加水印的流程"""
    # 1. 首先用Qwen-Image-2512生成图片
    # generated_image_path = qwen_generate(prompt_text)
    generated_image_path = "temp_generated_image.jpg"  # 假设这是生成的图片
    
    # 2. 自动后处理
    processor = QwenImagePostProcessor()
    final_image_path = processor.process_single_image(
        generated_image_path, 
        output_path="final_image_with_watermark.jpg",
        prompt=prompt_text
    )
    
    return final_image_path

# 使用示例
# result = generate_with_watermark("星空下的城堡,梦幻风格")

6. 实际效果与使用建议

6.1 效果对比展示

使用后处理脚本前后的对比:

  • 处理前:干净的图片,但没有任何版权信息
  • 处理后:右下角有半透明水印,EXIF中包含完整生成信息

你可以在图片属性中查看EXIF信息,或者在社交平台分享时,水印会自动保护你的创作权益。

6.2 实用建议

根据不同的使用场景,我有这些建议:

  1. 个人使用:使用基础水印,保持图片简洁
  2. 商业创作:使用增强版水印+完整EXIF,最大程度保护版权
  3. 批量处理:使用process_directory方法处理整个文件夹
  4. 自定义设置:根据需求调整水印文字、位置、透明度

如果水印位置不合适,可以修改代码中的坐标值;如果觉得水印太明显或太不明显,调整透明度参数即可。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐