ディスク容量を空けるためpythonで大量の画像ファイルをavifに変換した

ディスク容量を空けるため、スマホで撮影した画像やStable Diffusionで作った画像をavifに変換しました。

コーディング

Goで書くかShell Scriptにするか少し迷ったすえ、Pythonでコーディング。

Goはお仕事でたくさん使っているので、プライベートでは別の言語を使うか〜という理由。

import glob
import os

import pillow_avif  # noqa
from PIL import Image
from tqdm import tqdm


def convert_to_avif(file_path):
    with Image.open(file_path) as img:
        img.save(os.path.splitext(file_path)[0] + ".avif", "avif")
    os.remove(file_path)


dir_path = "./outputs"
file_paths = glob.glob(os.path.join(dir_path, "**/*.png"), recursive=True)
if file_paths == []:
    print("No png files found in input directory")
    exit()

print(f"Converting {len(file_paths)} files")
with tqdm(total=len(file_paths)) as progress_bar:
    for file_path in file_paths:
        convert_to_avif(file_path)
        progress_bar.update(1)
  1. ディレクトリを指定
  2. 指定したディレクトリ配下にある全てのpngファイルのパスを取得
  3. 一つずつpillowで画像ファイルを開き、pillow_avifというライブラリで変換
  4. 変換元ファイルは削除

画像ファイルが多いので変換に時間がかかることを考慮し、進捗がわかるようtqdmを利用。

結果

大小様々なPNG画像ファイル、合わせて29272個、73.06[Gbyte]。これらの画像ファイルをavif化し、2.79[GByte]まで削減されました。96%の削減。

まとめ

今回のコードはbing chatに作ってもらったコードを手直しして利用しました。もうこの程度のコーディングは自分で作るものでは無くなっちゃいましたね。

そうそう、以前からプライベートで利用していたのですが、ついにGitHub Copilotが職場に導入されました。コメント入力でスラスラとコードが生成される便利さに感動しつつ、エンジニアの労働環境が大きく変化していく怖さも感じています。とにかく今はAIの技術に触れつつ、その便利さを享受していこうかなと思いました。