PCでゲームをしていると、見もしないのにバシャバシャとスクリーンショットを撮ってしまう📷(あ、バシャバシャというオノマトペはカメラ由来なのでちょっと変だけど気にしない)。今やっているThe Witcher3だとロマンスシーンなんかはカットが変わるごとに保存!!!!🍆 🍆 🍆

けど、現実の写真と同じようにスクリーンショットは撮ること(保存すること)に意味があるのであって、決して見返したりしないという真理に気づいてしまった。スクリーンショットは大抵ロスレス圧縮なのでファイルサイズが大きく、しかも何十回と撮ることもザラである。はっきり言ってストレージの無駄でしかない。

ということでスクリーンショット画像をエンコードすることにした。どこかにアップロードする前提ならJPEGが妥当だが、スクリーンショットは「どれがうまく撮れたかなぁ」なんて選別すらしないという真理にも気づいているので当然アップロードもしない。精々まとめてクラウドストレージに上げるぐらいだ。よってコーデックなぞ「見ようと思えば見える」状態であればよい。

色々考えた結果AVIFに変換することにした。今の所、Chromeでサポートされているし、Firefoxでもそのうちサポートされる(最近リリースされたFirefox92でデフォルト有効化される予定だったがバグで延期された)。マイクロソフトの公式エクステンションをインストールすればエクスプローラーでプレビューも可能だ。

エンコードソフトにはchocolateyでインストールしたImageMagickを使った。スクリーンショットは大量なので一々手動でエンコードしてられない。たが、バッチ処理しやすい手軽なものが見つけられなかった。画像変換するくらいで100MB以上ある巨大なツールを使いたくなかったが、しょうがない。

#!/bin/sh
for file in *.png; do
    magick.exe convert -quality 50 "${file}" -set filename:f '%t' '%[filename:f].avif'
    if test $? = 0;then
        rm "${file}"
    fi
done

ターミナルから使いやすいようにシェルスクリプトを書いた。WSLは便利だ。環境によってpngではなくjxrで保存してある場合もあるかもしれないが、そこらはご自由に。

フルHDで20kBから100kBぐらいになるが、エンコード時間はjpegの100万倍ぐらい(体感で)かかる。アーカイブが目的なので時間がかかってもサイズが縮まればそれでよいのだ。