Skip to content

图片转 avif

约 302 字大约 1 分钟

2025-11-20

avif 格式可以很好的压缩图片的体积,适合前端网页使用,减轻图床压力,提升加载速度。

使用

依赖

pip install pillow pillow-avif-plugin

脚本

处理:仅处理脚本所在目录的文件
源文件:将被拷贝至 original 目录下

源目录下的源文件将被删除,仅保留输出的 avif 格式文件

import os
import shutil
from PIL import Image
import pillow_avif

def main():
    # 获取当前脚本所在目录
    base_dir = os.path.dirname(os.path.abspath(__file__))
    original_dir = os.path.join(base_dir, "original")

    # 创建备份文件夹
    if not os.path.exists(original_dir):
        os.makedirs(original_dir)

    # 支持的文件类型
    exts = {".jpg", ".jpeg", ".png"}

    files = os.listdir(base_dir)

    for file in files:
        # 跳过目录
        if os.path.isdir(os.path.join(base_dir, file)):
            continue

        name, ext = os.path.splitext(file)
        ext = ext.lower()

        if ext not in exts:
            continue

        src_path = os.path.join(base_dir, file)
        backup_path = os.path.join(original_dir, file)
        avif_path = os.path.join(base_dir, f"{name}.avif")

        print(f"处理文件:{file}")

        # 1. 备份原文件
        shutil.copy2(src_path, backup_path)

        # 2. 转 AVIF
        try:
            with Image.open(src_path) as img:
                img.save(avif_path, format="AVIF")
            print(f"已生成:{name}.avif")
        except Exception as e:
            print(f"转换失败:{file},错误:{e}")
            continue

        # 3. 删除原文件
        try:
            os.remove(src_path)
            print(f"已删除原文件:{file}")
        except Exception as e:
            print(f"删除失败:{file},错误:{e}")

    print("\n全部处理完成!")

if __name__ == "__main__":
    main()