今日のラーメン:二代目 拉麺大公 花(上大岡) ニンニク味噌

ブログの画像を軽くしたい

ブログの画像は別に高画質でなくてもいいので、手軽にリサイズしてファイルサイズを縮小したい。

どうせ画像をリサイズするなら、これから主流になるかと思われるGoogle製の画像フォーマット「webp」に変換したい。

ところがwebp対応で簡単にリサイズできるようなWebサービスもないので、とりあえずローカルで変換できるようにしようかと。

PythonでリサイズしてWebpに変換する

こういうのはサクッとPythonで作っちゃうのが楽。

画像処理ライブラリPILが開発止まっちゃってるので、実質的な後継のPillowをPIPして、こんなスクリプトを組んだ。

from PIL import Image
import re, os
import sys

img_format = "webp"
h_size = 768 # 変換後の横幅のサイズ
v_size = 600 # 変換後の縦幅のサイズ
Max_size = 200 # KBで指定

path = sys.argv[1]

# 画像ファイルを取得
files = pattern = ".*\.(jpeg|jpg|png|bmp)"
files = [f for f in os.listdir(path) if re.search(pattern, f, re.IGNORECASE)] # 大小文字無視

# 画像をリサイズ
for file_name in files:
    webp_file = os.path.splitext(os.path.basename(file_name))[0] + '.webp'
    img = Image.open(path + '/' + file_name).convert('RGB')
    new_img = img.copy() 
    new_img.thumbnail((h_size, v_size)) 
    for i in range(80, 0, -5): 
        new_img.save(path + '/' + webp_file, quality=i) 
        new_img_size = os.path.getsize(path + '/' + webp_file) / 1000 
        if new_img_size > Max_size and i > 5: 
            print(str(new_img_size) + 'KB '+ 'quality=' + str(i)) 
            os.remove(path + '/' + webp_file) 
        else: 
            os.remove(path + '/' + file_name)
            print(file_name + ':' + str(new_img_size) + 'KB '+ 'quality=' + str(i)) 
            break

引数に画像ファイルがあるフォルダを指定すると、いい感じにリサイズして、指定サイズに収まるように画質を調整したwebpに変換する。

このブログでは記事のMarkdownと画像を同じフォルダに入れているので、そのフォルダを指定すれば良い。

最初のラーメンの画像も、iPhoneから撮って出しだと2.4MBもあるんだけど、変換後はたった64KB。でも十分キレイに見えるので満足。

あとはこういうのを手動でコマンド叩くんじゃなくて自動でやれるようにできたらいいな。