見出し画像

.webp を .jpg に変換するゾ!

概要と背景

最近、.webpという拡張子の画像ファイルに出会うことが増えてきました。

どこで出会うかというと、アングラなネットを徘徊する血気盛んな青年男性なら分かるかと思います。
ちなみにラオス(.la)のドメインを採用しているサイトです。
.la - Wikipedia

と、読者が十分にドン引きしたと思いますので、さっさと本題に入ります。

「やりたいこと」と「ソリューション」

  • 特定のフォルダ配下すべての.webpを変換したい。

    • globで再帰的に検索する。

  • (大抵)連番で保存されているので、ファイル名は変えたくない。

    • 拡張子が変われば重複判定にならない。

  • 何を変換したのかログファイルを出力したい。

    • 実装する。

  • 対象のディレクトリで簡単実行したい。

    • fileからos.globキーを作成する。

  • Pythonの環境のないマシンでも実行したい。

    • Pyinstallerを活用する。

ソースコード

from PIL import Image
import os
import sys
import glob

def main():
    
    # 初回ログファイル生成
    log_path = os.path.join(os.path.dirname(sys.argv[0]),"log.txt")  # ログファイルのパス生成
    open(log_path, 'w',encoding='UTF-8',newline='').close            # ログファイル.txtを生成
    flog = open(log_path, 'a',encoding='UTF-8',newline='')           # 追記形式で開く

    # .webpのリスト
    s_key = generat_glob_key()                                       # 配下検索用のglobキー生成
    webp_list = glob.glob(s_key,recursive=True)                      # globで一致する.webpリストを取得

    # リストを処理
    for img_file in webp_list:

        fdir = os.path.dirname(img_file)                             # イメージファイルのディレクトリ
        fname = os.path.basename(img_file).replace(".webp",".jpg")   # イメージファイルの変換後拡張子
        save_path = os.path.join(fdir,fname)                         # イメージファイルの変換後保存パス

        if not(os.path.exists(save_path)):                           # 既に変換済みファイルがあるか
            
            str_logline = '変換中,' + img_file                      
            w_log(flog,str_logline)                                 

            img = Image.open(img_file).convert("RGB")                # 変換処理
            img.save(save_path,"jpeg")                               # 変換した画像(.jpg)を保存
            
            str_logline = '変換済,' + save_path
            w_log(flog,str_logline)

        else:
            str_logline = 'E:重複した変換処理,' + img_file
            w_log(flog,str_logline)

    flog.close() # ログファイルを閉じる

# デバッグ出力・ログファイル書出
def w_log(log_f,line):
    log_f.write(line + '\r\n')
    print('AYASE > ' + line)

# glob検索キーを生成
def generat_glob_key():
    current_dir = os.path.dirname(sys.argv[0])
    glob_key = current_dir + "/**/*.webp"
    return glob_key

if __name__ == '__main__':
    main()

このソースコードは Pyinstallerで動作するように記述しています。
.exe化する際には、--onefile 引数を与えてください。
また、不足しているライブラリは別途pipインストールしてくだちい。

うるせぇ!実行できるファイルをよこせ!
という方に向けて、Pyinstallerで実行ファイル化したものを以下に添付します。
※注意事項※
どんな理由があってもファイル消失や様々な損害について、作者は一切保証できません。自己責任でご利用ください。
心配でしたら、上記ソースコードをご自身でパッケージ化してください。