【Python】给动态图片加水印

5 篇文章 0 订阅
4 篇文章 0 订阅

原文:https://blog.c12th.cn/archives/35.html

前言

之前 图片加水印 是对于静态图片,而现在这个是对动态图片 (.gif) 加水印。


在这里插入图片描述

原图

在这里插入图片描述

加水印后


部分代码

def add_watermark_to_gif(gif_path, watermark_text, output_path, font_path, font_color, font_size, position):
    # 打开GIF图像
    with Image.open(gif_path) as gif:
        # 检查图像是否为GIF动画
        if gif.is_animated:
            # 获取GIF的帧数和持续时间
            frames = []
            durations = []
            for i in range(gif.n_frames):
                gif.seek(i)
                frame = gif.copy().convert("RGBA")  # 确保帧是RGBA模式
                frames.append(frame)
                durations.append(gif.info['duration'])

            # 为每一帧添加水印
            watermarked_frames = []
            for frame in frames:
                draw = ImageDraw.Draw(frame)
                # 加载字体
                font = ImageFont.truetype(font_path, font_size)

                # 在指定位置绘制水印
                draw.text(position, watermark_text, fill=font_color, font=font)
                watermarked_frames.append(frame)

            # 保存带有水印的GIF
            watermarked_gif = frames[0]
            watermarked_gif.save(
                output_path,
                save_all=True,
                append_images=watermarked_frames[1:],
                durations=durations,
                loop=0
            )
        else:
            # 如果GIF不是动画,只需为单帧添加水印
            with Image.open(gif_path) as img:
                img = img.convert("RGBA")  # 确保图像是RGBA模式
                draw = ImageDraw.Draw(img)
                font = ImageFont.truetype(font_path, font_size)
                draw.text(position, watermark_text, fill=font_color, font=font)
                img.save(output_path)

ini文件

def read_config(ini_path):
    config = configparser.ConfigParser()
    config.read(ini_path)

    # 获取ini
    watermark_text = config['diy']['text']
    font_path = config['diy']['path']
    font_color = tuple(map(int, config['diy']['color'].split(',')))
    font_size = int(config['diy']['size'])
    position = tuple(map(int, config['diy']['xy'].split(',')))
    output = config['diy']['out']

    return watermark_text, font_path, font_color, font_size, position, output

    batch_add_watermark_to_gifs('input', 'user.ini')
[diy]
path = STXINGKA.TTF
size = 36
text = @Reverse
color = 0, 255, 255
xy = 50, 50
out = out
# ini备注
path        水印字体路径
size        水印字体大小
text        水印字体
color       水印字体颜色(RGB)
xy          水印位置坐标X,Y
out         处理后的文件路径

CMD

rd /s /q .\out

rd /s /q .\input

mkdir input

先删除 outinput 文件夹,再生成 input 文件夹


完整代码

# 工程:test
# 创建时间:2024/6/24 23:20
# encoding:utf-8

from PIL import Image, ImageDraw, ImageFont
import os
import configparser


def read_config(ini_path):
    config = configparser.ConfigParser()
    config.read(ini_path)

    # 获取ini
    watermark_text = config['diy']['text']
    font_path = config['diy']['path']
    font_color = tuple(map(int, config['diy']['color'].split(',')))
    font_size = int(config['diy']['size'])
    position = tuple(map(int, config['diy']['xy'].split(',')))
    output = config['diy']['out']

    return watermark_text, font_path, font_color, font_size, position, output


def add_watermark_to_gif(gif_path, watermark_text, output_path, font_path, font_color, font_size, position):
    # 打开GIF图像
    with Image.open(gif_path) as gif:
        # 检查图像是否为GIF动画
        if gif.is_animated:
            # 获取GIF的帧数和持续时间
            frames = []
            durations = []
            for i in range(gif.n_frames):
                gif.seek(i)
                frame = gif.copy().convert("RGBA")  # 确保帧是RGBA模式
                frames.append(frame)
                durations.append(gif.info['duration'])

            # 为每一帧添加水印
            watermarked_frames = []
            for frame in frames:
                draw = ImageDraw.Draw(frame)
                # 加载字体
                font = ImageFont.truetype(font_path, font_size)

                # 在指定位置绘制水印
                draw.text(position, watermark_text, fill=font_color, font=font)
                watermarked_frames.append(frame)

            # 保存带有水印的GIF
            watermarked_gif = frames[0]
            watermarked_gif.save(
                output_path,
                save_all=True,
                append_images=watermarked_frames[1:],
                durations=durations,
                loop=0
            )
        else:
            # 如果GIF不是动画,只需为单帧添加水印
            with Image.open(gif_path) as img:
                img = img.convert("RGBA")  # 确保图像是RGBA模式
                draw = ImageDraw.Draw(img)
                font = ImageFont.truetype(font_path, font_size)
                draw.text(position, watermark_text, fill=font_color, font=font)
                img.save(output_path)


def batch_add_watermark_to_gifs(gif_folder, ini_path):
    watermark_text, font_path, font_color, font_size, position, output = read_config(ini_path)

    # 确保输出文件夹存在
    if not os.path.exists(output):
        os.makedirs(output)

    # 遍历GIF文件夹中的所有文件
    for filename in os.listdir(gif_folder):
        if filename.lower().endswith('.gif'):
            input_path = os.path.join(gif_folder, filename)
            output_path = os.path.join(output, filename)
            add_watermark_to_gif(input_path, watermark_text, output_path, font_path, font_color, font_size, position)

        print(f"{filename}")

batch_add_watermark_to_gifs('input', 'user.ini')

print('图片已批量处理完成!')


使用教程(打包整理后文件)

请添加图片描述\

这里的步骤跟 Python日记 - 图片加水印 一致

  1. 打开 user.ini里面的配置可自行修改

  2. 把将要处理的图片全部放到 input 文件夹中

  3. 双击运行 main.exe

  4. 等待窗口运行

  5. 处理后的图片在 out

  6. 双击 删除.bat (这个用于快速清理 inputout 的文件)

注意事项

  1. 图片只支持 gif 格式图片

  2. 如果需要改字体文件,还需要在 user.ini 里修改水印字体路径

path = 水印字体路径

最后

代码已上传到 githubgitee

打包整理后文件 蓝奏云 密码:9g98


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c12th

能请我喝奶茶吗qwq

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值