› Spec
CPU: Apple M1 or Intel i5
RAM: 8GB
Storage: 256GB SSD
OS: macOS or Windows 11
Python: 3.11.5 and 3.8.7
Python_venv_path: Only /desktop/[folder]
IDE: Visual Studio Code
› Home › About › Archive › Categories › Guestbook

Categories : Python

이미지의 .webp 변환


  1. .webp 변환에 대한 소개글
    1. 0. 개요
    2. 1. .webp를 선택한 이유
    3. 2. 코드
    4. 3. 적용

.webp 변환에 대한 소개글

0. 개요

블로그의 이미지를 업로드 하면서 이미지의 용량이 늘어나고 있다.
용량최적화 및 사이트개선을 위해 현재 업로드된 이미지를 전부 webp 확장자로 변환하려한다.
갯수 제한이 걸려있는 웹사이트에서 수동으로 100개 이상이나 있는 이미지를 모두 진행할순 없으니 파이썬으로 진행할려한다.
이 글은 파이썬을 통해 이미지를 최적화하고 webp파일로 전환하는 코드를 소개하는 글이다.

1. .webp를 선택한 이유

  1. 용량이 적음
    같은 품질대비 .jpg, .png 보다 파일 크기가 작고, 로딩 속도가 빠르다.
    이는 SEO와 사용자 경험에 최적화된 환경을 만들어줄 것이다.

  2. 품질 유지
    예시로 .png 500KB 와 .webp 로 변환된 150KB만 비교해봐도 화면으로 보는 품질의 차이는 거의 없다.
    또한 추가적인 내용으로는 그만큼의 고화질을 요구하지도 않는다. 이또한 1번항목과 큰 연관을 가진다.

  3. 지원하는 브라우저
    웬만한 구형 브라우저, 기기 외에는 최근엔 거의 모든 브라우저와 기기는 .webp 이미지는 모두 지원한다.

2. 코드

pip install pillow


from PIL import Image
import os

# 변환할 폴더 경로
input_folder = "./img"
output_folder = "./webp"  # 수정된 경로

# 출력 폴더가 없으면 생성
os.makedirs(output_folder, exist_ok=True)

# 변환할 이미지 파일들
supported_extensions = ('.jpg', '.jpeg', '.png')

for filename in os.listdir(input_folder):
    if f.lower().endswith(('.jpg', '.jpeg', '.png')):
        img = Image.open(os.path.join(input_folder, filename))
        ext = os.path.splitext(filename)[1].lower()

        if ext == ".png" or img.mode == "RGBA":
            # PNG나 투명도가 있는 이미지는 무손실 압축 사용
            img = img.convert("RGBA")
            img.save(os.path.join(output_folder, os.path.splitext(filename)[0] + ".webp"), "WEBP", lossless=True)
        else:
            # 투명도가 필요 없으면 RGB로 변환 후 손실 압축 (최적화된 quality)
            img = img.convert("RGB")
            img.save(os.path.join(output_folder, os.path.splitext(filename)[0] + ".webp"), "WEBP", quality=80)


print("이미지 변환 완료.")


3. 적용

이미 현재 블로그에는 .webp 가 모두 적용되었다.
이미지 폴더의 크기가 120MB -> 28MB 로 약 80% 크게 개선되었다.
이 코드에서는 이미지 배경 투명도에 대한코드가 적용되었지만,
블로그의 이미지 파일들은 이미 배경 투명도를 적용하지 못했다.
이를 미쳐 생각하지 못하고 모두 덮어 씌웠기 때문에 복구는 불가.


확대 이미지