Pillow を新しくしてから、画像のリサイズなどで Image.ANTIALIAS を使っているところで、次のエラーが出て止まることがあります。
AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'
たとえば、こういうコードで出ます。
img = img.resize((width, height), Image.ANTIALIAS)
これは、Pillow が 10.0 で Image.ANTIALIAS を削除したために起きます。
なぜ削除されたのか
Pillow は 9.1 で Image.Resampling という enum にリサンプリング定数をまとめ直し、Image.ANTIALIAS のような直下の名前をいったん一括で非推奨としました。ただしこの一括の非推奨は 9.4 で取り消され、BICUBIC・BILINEAR・NEAREST・LANCZOS など正準の定数は直下の名前のまま残っています。10.0(2023-07-01)で削除されたのは、重複していた旧別名の3つ(ANTIALIAS・LINEAR・CUBIC)だけです。ANTIALIAS は LANCZOS(高品質な縮小フィルタ)の古い呼び名で、LINEAR は BILINEAR、CUBIC は BICUBIC の旧別名でした。削除後に Image.ANTIALIAS を参照すると AttributeError になります。
ANTIALIAS の中身は LANCZOS と同じです。LANCZOS を指せば、同じ結果でそのまま動きます。
なぜ Pillow 10 以降で出るのか
同じコードでも、Pillow が 10 より前なら通ります(DeprecationWarning(「Pillow 10 で削除される」と告げるもの)は出ますが動きます)。エラーになるのは Pillow を 10 以降に上げた後です。手元やこれまでの環境が 9 系のままなら踏みません。次のような形で表面化します。
- Pillow を 10 / 11 / 12 に上げた:別のパッケージを入れたら Pillow も一緒に上がった、環境を作り直した、などで新しい Pillow になります。
- チュートリアルや古いサンプルのコードをそのまま使った:ネット上の
Image.ANTIALIASを使う例は 9 系までの書き方で、新しい Pillow では動きません。 - 落ちているのが自分のコードではなく、古い第三者ライブラリの中:長く更新されていないライブラリが
Image.ANTIALIASを使っています。
直し方1:ANTIALIAS を LANCZOS に直す(基本)
自分のコードなら、Image.ANTIALIAS を Image.Resampling.LANCZOS に置き換えます。結果は同じです。
# 変更前
img = img.resize((width, height), Image.ANTIALIAS)
# 変更後
img = img.resize((width, height), Image.Resampling.LANCZOS)
Image.Resampling.LANCZOS が正準(9.1 以降)の書き方です。Image.LANCZOS という短い直下の別名も新しい Pillow でそのまま動きます(BICUBIC・BILINEAR・NEAREST・LANCZOS は 9.4 で直下に残すことが確定していて、削除の予定はありません)。Image.Resampling.* を使うのはコードスタイル上の推奨であって、必須ではありません。削除されたのは重複していた旧別名の3つだけなので、置き換えが要るのも次の3つです。
| 10.0 で削除された旧別名 | 置き換え |
|---|---|
Image.ANTIALIAS | Image.Resampling.LANCZOS |
Image.LINEAR | Image.Resampling.BILINEAR |
Image.CUBIC | Image.Resampling.BICUBIC |
古い Pillow も同時にサポートしたいライブラリなら、両対応にもできます。
try:
RESAMPLE = Image.Resampling.LANCZOS # Pillow 9.1 以降
except AttributeError:
RESAMPLE = Image.ANTIALIAS # Pillow 9.0 以前
直し方2:直せないのが依存ライブラリのとき
エラーが自分のコードではなく、入れた第三者ライブラリの中で出ているなら、コードは直せません。
- そのライブラリを新しくする:
pip install --upgrade <ライブラリ>。多くは Pillow 10 対応の版が出ています。まずこれを試します。 - どうしても上げられないなら、つなぎで Pillow を 9 系に固定する:
pip install "pillow<10"。ただし 9 系は古く、他の新しいパッケージと衝突することがあるので、ライブラリを更新するまでの当座の措置です。
pip install "pillow<10"
新しい Pillow を保ったままにできる直し方1(コード修正/ライブラリ更新)が本筋で、Pillow を下げるのは当座の回避に留めます。
切り分け(うまくいかないとき)
Image.CUBICやImage.LINEARでも同じエラーが出る:削除された旧別名はANTIALIAS・LINEAR・CUBICの3つです。CUBICはImage.BICUBIC(またはImage.Resampling.BICUBIC)に、LINEARはImage.BILINEAR(またはImage.Resampling.BILINEAR)に置き換えます。BICUBIC・BILINEAR・NEARESTは直下の名前のまま残っているので、これらはエラーにはなりません。ANTIALIASを直したのに、まだ同じエラーが出る:別の箇所や、インポートされた別モジュールに残っています。ANTIALIASをコード全体で検索して洗い出します。第三者ライブラリ内なら直し方2です。Image.ResamplingそのものがAttributeErrorになる:Pillow が 9.1 より古いケースです。その環境ではImage.LANCZOS(旧来の直下の名前)を使うか、Pillow を 9.1 以降に上げます。- Pillow を下げたら、他のパッケージが動かなくなった:新しいパッケージが Pillow 10 以降を要求しているケースです。Pillow を下げる方向でなく、直し方1(コード修正/ライブラリ更新)へ切り替えます。
検証環境
python:3.11-slim、ネットワーク有り- 再現:
pillow==10.4.0でImage.ANTIALIASを参照すると、module 'PIL.Image' has no attribute 'ANTIALIAS'を出して終了コード 1 - 修正:同じ
pillow==10.4.0でImage.Resampling.LANCZOSにすると、終了コード 0
再現から修正までは errfix の検証ハーネスが機械的に確認しています。ここでは Pillow の版を下げずに、ANTIALIAS を Image.Resampling.LANCZOS に直すと同じ Pillow で通ることを、再現から消滅まで通しました。境界が Pillow 10 であることは、pillow<10(9.5.0)では同じ Image.ANTIALIAS が DeprecationWarning(「Pillow 10 で削除される」と告げるもの)つきで動くことを確かめて裏づけています。エラー文言は実機出力から引用しています。削除された旧別名が ANTIALIAS・LINEAR・CUBIC の3つであることや、それが 10.0 であることは、機械検証の対象を ANTIALIAS の1点に限り、一般的な情報として Pillow のリリースノート(9.1 の Resampling 導入と一括非推奨・9.4 での非推奨取り消し・10.0 の旧別名削除)に沿って書いています。