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

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

コーディング

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

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

 1import glob
 2import os
 3
 4import pillow_avif  # noqa
 5from PIL import Image
 6from tqdm import tqdm
 7
 8
 9def convert_to_avif(file_path):
10    with Image.open(file_path) as img:
11        img.save(os.path.splitext(file_path)[0] + ".avif", "avif")
12    os.remove(file_path)
13
14
15dir_path = "./outputs"
16file_paths = glob.glob(os.path.join(dir_path, "**/*.png"), recursive=True)
17if file_paths == []:
18    print("No png files found in input directory")
19    exit()
20
21print(f"Converting {len(file_paths)} files")
22with tqdm(total=len(file_paths)) as progress_bar:
23    for file_path in file_paths:
24        convert_to_avif(file_path)
25        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の技術に触れつつ、その便利さを享受していこうかなと思いました。