python으로 avif 변환하기

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

페이지스피트 인사이트에서 블로그를 점검해보니 이미지 로드에 시간이 많이 소요되고 있었다.

이미지 다이어트가 필요함을 깨닫는 순간이었다.

원래는 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의 성능에 대한 내용은 넷플릭스의 공식 블로그를 확인해보자.

avif 확장자는 자본의 논리에 따라 기업에서 계속 밀어주고 있으니 앞으로도 계속 발전할 듯 하다.

블로그에 적용해서 SEO 최적화도 노려보자.

관련 글

밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
7장 내용은 지시를 따르도록 미세 튜닝하는 과정이다.어떤 질문에 대해 기대하는 응답을 하도록 하는 것.역시나 필요한 것은 데이터이다.1. 지시 미세 튜닝 절차여기서의 핵심은 질문-응답 데이터 셋을 준비하여 입력-출력 쌍으로 훈련시키는 것.이걸 프롬프트 스타일이라고 한다...
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
6장은 분류를 위한 미세 튜닝하기이다.예제로 나오는 것은 스팸 분류기 만들기.스팸 분류기는 이것이 스팸인지, 스펨이 아닌지를 분류하는 것이므로 출력의 결과가 0, 1과 같은 값으로 나와야 한다.1. 미세튜닝의 순서미세 튜닝의 과정은 모델을 훈련시키는 과정과 비슷하다.데...
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
오늘은 12월 14일이다.사실 챌린지 기간은 이미 2주나 지나 버렸지만, 그렇다고 후기를 포기할 순 없었다.이렇게 남기는 TIL이 나중에 피와 살이 되기 때문.코드 자체보다는 의미에 집중해서 적어보려고 한다.1. 모델의 손실 계산GPT 모델을 만든 후에 어떤 방식으로 ...
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
오늘이 11월 26일이니, 매일 1장식 독파하면 챌린지 성공이다.첫째와 둘째의 방해 속에서 가능할지 모르겠다.1. 더미 트랜스포머GPT 모델을 만들면서 파이토치에서 트랜스포머 더미 블록을 가져오는 것을 봤다.찾아보니 pytorch의 nn 안에는 이미 여러 트랜스포머 모...
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
맥북에 물을 한바가지 쏟은 후, 멘붕이 와서 3~4일 정도를 허비했다.지금 생각해보니 그냥 어차피 맥북은 나간거고, 수리 맡긴다고 생각하고 뭐라도 할걸 그랬나 싶다.어쨌든 조금 늦었지만, 그래도 끝까지 달려봐야 한다는 생각에 3장 후기를 남긴다.1. 어텐션 메커니즘3장...
밑바닥부터 만들면서 배우는 LLM 2장 독서 후기
밑바닥부터 만들면서 배우는 LLM 2장 독서 후기
벌써 챌린지 참여 2주차.어제 까지만 해도 2장을 못 끝냈는데, 1박 2일 연수를 온 김에 12시까지 코딩해보면서 겨우 진도를 맞췄다.1. 내용2장의 내용은 단어의 토큰화, 인코딩, 디코딩, 임베딩 벡터가 중심이었다.원핫 인코더를 만들어봐서 다른건 익숙했지만, 임베딩 ...

댓글을 불러오는 중...