用 Python 转换 AVIF

힘센캥거루
2025년 1월 13일(수정됨)
52
python

在 PageSpeed Insights 检查博客时发现加载图片耗时较多。

意识到图片需要减肥的时刻到了。

原本使用 webp 格式,但后来了解到avif压缩率高、兼容性好,还支持动图

所以决定比较一下。

用 Python 转换 AVIF-1

将png文件更改为avif后,大小缩小了10倍。

2~3倍还可理解,但10倍实在太大。

我决定必须更换。

用 Python 转换 AVIF-2

使用 Python 可以将png转换为avif,或者将avif转换为png。

首先使用pip安装所需的库。

pip install pillow pillow_avif imageio

我的图片存储在 posts/[slug]/*.png 这样的路径。

所以前往该路径将所有png文件转换为avif。

from PIL import Image
import pillow_avif
import imageio
import pathlib

path = pathlib.Path.cwd()
# 检查当前目录下的所有文件。
for folder in path.iterdir():
    if folder.is_dir():
        for file in folder.iterdir():
            # 如果是文件夹,检查文件夹中的文件。
            # 如果扩展名是 jpg, png 等图像文件,则执行。
            if file.suffix in [".jpg", ".png", ".gif", ".PNG", ".JPG", ".jpeg", ".webp"]:
                img = Image.open(file)
                # 如果是gif文件,则必定为动图。
                # 将每个图像保存为帧并转换。
                if file.suffix == ".gif" :
                    frames = []
                    frame_count = 0
                    try:
                        while True:
                            current_frame = img.convert('RGB')
                            frames.append(current_frame)
                            img.seek(img.tell() + 1)
                    except EOFError:
                        pass
                    imageio.mimsave(f'{file.parent}/{file.stem}.avif', frames, format='AVIF')
                # 否则直接转换扩展名并保存。
                else:
                    img.save(f'{file.parent}/{file.stem}.avif')

这样转换以后,5.5MB的动图变成了500kb。

压缩率真的很惊人。

用 Python 转换 AVIF-3

关于AVIF的性能,请查看Netflix的官方博客。

avif扩展名因资本的逻辑而被企业不断推进,未来似乎会不断发展。

尝试应用到博客中以优化SEO。

댓글을 불러오는 중...