用 Python 转换 AVIF

힘센캥거루
2025년 10월 26일(수정됨)
2
59

在 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}.webp', frames, format='AVIF')
                # 否则直接转换扩展名并保存。
                else:
                    img.save(f'{file.parent}/{file.stem}.webp')

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

压缩率真的很惊人。

用 Python 转换 AVIF-3

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

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

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

관련 글

从零构建中学习 LLM 第7章读书心得与挑战回顾
从零构建中学习 LLM 第7章读书心得与挑战回顾
第7章的内容是让模型遵循指令进行微调的过程。也就是让它针对某个问题给出我们期望的回答。果然,最需要的还是数据。1. 指令微调步骤这里的核心是准备好问答数据集,用作输入-输出对来进行训练。这就叫做提示(prompt)风格。其他部分就像之前的流程一样,对内容进行分词(tokenize)、训练和评估,过程...
从零开始构建中学习 LLM 第 6 章读后感
从零开始构建中学习 LLM 第 6 章读后感
第 6 章是为分类进行微调。作为例子给出的任务是构建垃圾邮件分类器。垃圾邮件分类器需要判断一封邮件是不是垃圾邮件,因此输出结果要是类似 0、1 这样的值。1. 微调的顺序微调的过程和训练模型的过程很相似。准备数据集,加载权重值,然后进行训练和评估。稍微不同的一点是,会有一个把输出层映射到 0(非垃圾...
从零开始构建中学习 LLM 第5章读书后记
从零开始构建中学习 LLM 第5章读书后记
今天是12月14日。其实挑战期已经过去整整两周了,但也不能因此就放弃写后记。像这样留下的 TIL(Today I Learned),以后都会变成自己的血和肉。这次打算比起代码本身,更专注在“意义”上来写一写。1. 模型的损失计算这一部分讲的是,在构建好 GPT 模型之后,用什么方式来计算损失。GPT...
从零开始动手实现 LLM 第4章读书心得
从零开始动手实现 LLM 第4章读书心得
今天是11月26日,如果每天读一章并看完的话,这次挑战就算成功。在老大和老二的各种干扰下,不知道能不能做到。1. Dummy Transformer在实现 GPT 模型的过程中,看到是从 PyTorch 里拿来一个 Transformer 的 dummy 模块用的。一查才发现,在 PyTorch 的...
通过从头构建学习的LLM第3章读后感
通过从头构建学习的LLM第3章读后感
我在MacBook上泼了一大杯水后,崩溃了,浪费了大约3-4天。现在回想起来,反正MacBook已经坏了,应该想着送修,干点别的事情。无论如何,虽然有点晚了,但我觉得必须坚持到底,所以留下了第3章的读后感。1. 注意力机制第3章...
通过从头开始制作学习 LLM 第二章读书笔记
通过从头开始制作学习 LLM 第二章读书笔记
已经是参加挑战的第二周。昨天还没有完成第二章,趁着来参加 1 泊 2 日的研修,熬到 12 点才勉强赶上进度。1. 内容第二章的内容以单词的分词、编码、解码、嵌入向量为中心。尽管之前试过制作 One-hot 编码器,对于其他部分比较熟悉,但是嵌入向量本身的内容是新的。

댓글을 불러오는 중...