先日公開したJPEGをAVIFにコンバートするプログラムにバグがありました。せっかくなので、このデバッグをBardさんに頼んでみようと思います。

どんなバグなのか?
仕様が完全に私の欲望を叶えるだけのものであったため、発生したバグです。デジカメ取って出しのJPEGファイルのみでしかテストしていなかったのがマズかった…。
Exif 情報 を持たないJPEGファイルを対象にコンバートした際にエラーストップしてしまいます。さっそく、Bardさんにこのバグを直していただきましょう。
Bardさんからのアドバイス
Bardさんにコードとエラーの内容を説明すると、あっと言う間に修正コードをくれました。
バグありのコード
im.save(im_io, 'avif', quality = QUALITY, exif=im.info['exif'])
バグ修正後のコード
try:
im.save(im_io, 'avif', quality=QUALITY, exif=im.info['exif'])
except KeyError:
im.save(im_io, 'avif', quality=QUALITY)
素晴らしい!
エラートラップを入れて、exif がないファイルに対しては余分な処理をスキップするようになっています。修正コードを素っ気なく返すだけではなく、ご親切にも解説までしてくれるのです!
Bardさんのお言葉
修正内容は次のとおりです。
exifプロパティの値を、im.info.get("exif")に変更しました。if exif is None:の条件式を追加しました。exifプロパティの値がNoneの場合は、exifプロパティに{}を設定するようにしました。
修正後のコードを実行すると、Exif データが存在しない JPEG ファイルも正常に変換できるようになります。
修正の理由は次のとおりです。
- 元のコードでは、
im.info['exif']で Exif データにアクセスしようとしていました。しかし、このコードは Exif データが存在しない場合にKeyErrorが発生します。 - 修正したコードでは、
im.info.get("exif")で Exif データにアクセスするようにしました。このコードは、Exif データが存在しない場合はNoneを返します。 - 修正したコードでは、
if exif is None:の条件式を追加しました。この条件式で、Exif データが存在しないかどうかをチェックするようにしました。 - 修正したコードでは、Exif データが存在しない場合は、
exifプロパティに{}を設定するようにしました。この設定で、Exif データが存在しない場合にKeyErrorが発生しないようにしました。
ご参考になれば幸いです。
はい、デバッグさせていただきます。
このコードは、JPEGファイルを AVIF ファイルに変換するプログラムです。まず、glob モジュールを使って、現在のディレクトリで .JPG ファイルの glob を取得します。次に、各ファイルに対して、次の処理を行います。
- 元のファイルサイズを取得します。
- ファイル名を取得します。
Image.open()メソッドを使って、画像を読み込みます。im_ioという名前の BytesIO オブジェクトを作成します。im.save()メソッドを使って、画像を AVIF 形式で保存します。- 保存したファイルのサイズを取得します。
- 圧縮率を計算します。
- 圧縮率を表示します。
このコードは、正常に動作すると思いますが、いくつかの注意点があります。
pillow_avifモジュールは、まだ開発中なので、バグがある可能性があります。- 圧縮率は、画像のコンテンツによって異なります。
- 圧縮率を高くすると、ファイルサイズは小さくなりますが、画質が低下する可能性があります。
他に何かご不明な点がございましたら、お気軽にお尋ねください。
このコードがどのような処理をしているのか、日本語で解説してくれていますね。おまけに、avif の取り扱い注意事項や画質に関する懸念までを親切丁寧に解説してくれています。感動です…。
修正プログラム
ということで、Bardさんに修正してもらったコードをベースに実行ファイルを生成し直したので、ここに置いておきますね。
もはや、プログラムを教える先生は不要かも
あなたがプログラムを学習したいなら、Bardさんを師と仰いて勉強してみるとよいかもしれません。聞けば、きっと欲しい答えを返してくれることでしょう。

