본문 바로가기
PC/Programming

[Python] image to Webp 변환

by dragom 2020. 11. 7.
반응형

최근 운영중인 홈페이지(이 블로그 말고 직접 html, php로 코딩해 synology NAS를 통해 서비스 중인)에

google search console을 사용하게 되었습니다.

재밌는 기능에 무슨 다른 재밌는 것들이 있나 열심히 돌아다니다보니 google PageSpeed Insights 라는 기능을 발견했습니다.

https://developers.google.com/speed/pagespeed/insights/

 

PageSpeed Insights

모든 기기에서 웹페이지 속도를 개선해 보세요.

developers.google.com

이 곳에서는 web page의 로딩 속도를 분석하고 어떤 문제들이 로딩 속도를 느리게 하는지 분석해 알려줍니다.

오늘의 주제인 "webp 변환기"는 이 결과에서 추천하는 작업 중 "차세대 형식을 사용해 이미지 제공하기" 항목에 해당합니다.

차세대!!! 뭔가 듣기만해도 간질간질하고 참을 수 없는 유혹을 느끼는 단어입니다.

결국 jpg, gif, png 등 이미지 파일들을 웹서비스에 최적화된 형식인 webp로 바꾸라는 말이었습니다.

장점은 브라우저에서 볼 때 거의 화질 저하를 느낄 수 없게 하면서도 적은 용량으로 빠른 서비스 및 낮은 서버 부하를 가지는 점이고, 

단점은 일부 오래된 브라우저들은 지원하지 못할 수 있다는 점 입니다.

어쨋든 저는 차세대라는 말을 보고 참을 수 없었기에 운영중인 서버의 png, jpg를 모두 webp로 바꿀 생각을 하게 되었습니다.

 

PageSpeed Insight 의 설명을 쭉 따라가다보니 

https://developers.google.com/speed/webp/

 

A new image format for the Web  |  WebP  |  Google Developers

A new image format for the Web.

developers.google.com

위 페이지에서 변환기를 배포하고 있었습니다.

여기서 최신 버전을 받아 변환을 시도합니다. (빠른 링크>> libwebp-1.1.0-windows-x64.zip)

 

다운 받으신 압축 파일 내에 bin 폴더가 있고 그 안에 cwebp와 dwebp가 있습니다.

여기에 cwebp가 이미지 파일을 webp로 converter해주는 프로그램이고, dwebp는 webp를 decode하는 반대의 프로그램입니다.

공식 사이트의 변환 방법이고 저도 이것을 참고해 이미지를 하나하나 변환하기 시작했습니다.

이미지 주소 복사해서 넣고, -o에 한번 더 넣고 확장자 바꿔주고

그렇게 두 세개 하다보니 슬슬 열이 받더군요.

 

그래서 간단하게 python으로 drag & drop 으로 변환할 수 있게 간단한 코드를 작성했습니다.

원래는 폴더 입력 넣으면 하위폴더 내 모든 이미지 다 처리할까 했지만, 일단 저는 이미지가 그렇게 많지 않고 하나씩 변확해도 괜찮을 지 좀 확인해서 넣어야 했기에...

결국 그냥 대상 파일만 끌어 넣으면 자동으로 동일한 위치에 .webp로 바뀐 파일이 생성된다고 보시면 될 듯 합니다.

import os, subprocess,sys

def run():
    while True:
        command=input("Image to WebP target: ")
        if "exit" in command:
            print("Program terminated")
            break
        else:
            if os.path.splitext(command)[-1]==".webp":
                command2="dwebp.exe -q 80 -m 6 -mt -progress "+command+" -o "+os.path.splitext(command)[0]+".webp"
            elif os.path.splitext(command)[-1]==".gif":
                command2="gif2webp.exe -q 80 -m 6 -mt "+command+" -o "+os.path.splitext(command)[0]+".webp"
            else:
                command2="cwebp.exe -q 80 -m 6 -mt -progress "+command+" -o "+os.path.splitext(command)[0]+".webp"
            try:
                print(command2)
                process = subprocess.Popen(command2,stdout=subprocess.PIPE,universal_newlines=True)
                while process.poll() is None:
                    output = process.communicate()[0]
                    print(output,end="")
                print("\n===Done===\n")
            except Exception as eee:
                print("Error occur: {}".format(eee))

if __name__ == "__main__":
    print("==Image to Webp converter==\n물론 webp를 넣으면 jpg로 변환도 함.\n파일 path를 써 넣어도 되고, cmd창에 drag & drop 해도 됨.")
    run()

 

webp_converter.exe
9.41MB

실행파일의 경우 그냥 적당하게 quality를 80으로 맞춰놨으니 필요하시다면 위 python 코드에 quality부분 수정하여 사용하셔도 문제 없습니다~

실행파일은 아까 받은 bin 폴더에 넣으시고 실행하시면 됩니다.

cmd 창이 뜨는데 여기에 변환하고자 하는 파일 drag & drop 하면 파일 경로가 자동으로 입력되며 "엔터" 쳐 주시면 원래 파일의 위치에 동일한 파일명.webp로 변환되어 저장됩니다.

 

** 혹시 각 page에서 소스 코드를 .jpg/png --> .webp로 바꾸는게 귀찮으신 분들은

원본 이미지 백업해 놓으시고 webp 파일을 .jpg로 저장하시는 것도 방법이겠네요.

반응형

댓글