webp?
Googleが開発した次世代型の静止画フォーマットです。軽量なフォーマットで.jpgと比べると3割前後容量が軽くなり、画質も.jpgと比べて目立った悪さはありません。多くの環境で対応しておりwebにも活用はできますが、safariなどのApple系の環境では現時点では対応していないため注意が必要です。
コード
import os
import sys
from PIL import Image
sys.setrecursionlimit(10 ** 9)
cur_path = os.path.dirname(__file__) + "\\"
img_formats = [".bmp", ".jpg", ".jpeg", ".png"]
def conv_webp(file_path, is_del=False):
file_type = os.path.splitext(file_path)[-1]
if file_type.lower() in img_formats:
img = Image.open(file_path)
webp = file_path.replace(file_type, ".webp")
img.save(webp, "WEBP")
print(webp)
if is_del:
os.remove(file_path)
def recursive_file_check(path):
if os.path.isdir(path):
files = os.listdir(path)
for file in files:
recursive_file_check(r"{}\{}".format(path, file))
else:
try:
conv_webp(fike_path=path, is_del=False)
except Exception as e:
print(str(e))
if __name__ == "__main__":
recursive_file_check(cur_path)
コードの概要
コードの配置場所より下層に存在する画像ファイルに対してwebp変換をする動作とします。img_formatsの中に変換対象の拡張子を記載するとPillowで画像を読み込みwebpに変換するという単純な動作をします。ファイルの読み出しには再帰関数を利用してすべてのファイルが読み終わるまで変換の処理を続ける動作となります。conv_webpのis_del引数をTrueにすると変換と同時に元ファイルを削除します。初期設定では消さないようにしていますが、元ファイルを残したい場合はTrueに変更しないように注意してください。
改良
tkinterなどを使い拡張子の設定や対象のファイルパスを設定できるようにするとより実用的に使えるようになるかもです。再帰関数の呼び出しのためのデータをos.walk()を使うことでスッキリ書けそうです。
容量
NEX-7という一眼でとったjpg画像10枚(46.2MB)が4.08MBになりました。圧縮率の設定等もあると思いますがまとめて圧縮できたのはとてもありがたいです。圧縮率など同条件となるとjpgでは3割前後の削減が目安になりそうです。
まとめ
もっとwebpが普及してほしい。