Error [module 'PIL.Image' has no attribute 'ANTIALIAS']

AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS' の直し方(Pillow 10 で削除された)

FIX SUMMARY verified
Applies when
python:3.11-slimPillow >=10 (Image.ANTIALIAS removed; use Image.Resampling.LANCZOS)using Image.ANTIALIAS on Pillow 10+ (own code, old tutorial, or a third-party library; Pillow pulled up by a dependency)

Verified: reproduced in python:3.11-slim, then the module 'PIL.Image' has no attribute 'ANTIALIAS' signature was gone after the fix (exit 0).

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 で取り消されBICUBICBILINEARNEARESTLANCZOS など正準の定数は直下の名前のまま残っています。10.0(2023-07-01)で削除されたのは、重複していた旧別名の3つ(ANTIALIASLINEARCUBIC)だけです。ANTIALIASLANCZOS(高品質な縮小フィルタ)の古い呼び名で、LINEARBILINEARCUBICBICUBIC の旧別名でした。削除後に 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.ANTIALIASImage.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 でそのまま動きます(BICUBICBILINEARNEARESTLANCZOS は 9.4 で直下に残すことが確定していて、削除の予定はありません)。Image.Resampling.* を使うのはコードスタイル上の推奨であって、必須ではありません。削除されたのは重複していた旧別名の3つだけなので、置き換えが要るのも次の3つです。

10.0 で削除された旧別名置き換え
Image.ANTIALIASImage.Resampling.LANCZOS
Image.LINEARImage.Resampling.BILINEAR
Image.CUBICImage.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.CUBICImage.LINEAR でも同じエラーが出る:削除された旧別名は ANTIALIASLINEARCUBIC の3つです。CUBICImage.BICUBIC(または Image.Resampling.BICUBIC)に、LINEARImage.BILINEAR(または Image.Resampling.BILINEAR)に置き換えます。BICUBICBILINEARNEAREST は直下の名前のまま残っているので、これらはエラーにはなりません。
  • 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.0Image.ANTIALIAS を参照すると、module 'PIL.Image' has no attribute 'ANTIALIAS' を出して終了コード 1
  • 修正:同じ pillow==10.4.0Image.Resampling.LANCZOS にすると、終了コード 0

再現から修正までは errfix の検証ハーネスが機械的に確認しています。ここでは Pillow の版を下げずに、ANTIALIASImage.Resampling.LANCZOS に直すと同じ Pillow で通ることを、再現から消滅まで通しました。境界が Pillow 10 であることは、pillow<10(9.5.0)では同じ Image.ANTIALIASDeprecationWarning(「Pillow 10 で削除される」と告げるもの)つきで動くことを確かめて裏づけています。エラー文言は実機出力から引用しています。削除された旧別名が ANTIALIASLINEARCUBIC の3つであることや、それが 10.0 であることは、機械検証の対象を ANTIALIAS の1点に限り、一般的な情報として Pillow のリリースノート(9.1 の Resampling 導入と一括非推奨・9.4 での非推奨取り消し・10.0 の旧別名削除)に沿って書いています。

検証(machine-verified)

この修正は python:3.11-slim のバージョン固定コンテナ内で再現し、修正後に module 'PIL.Image' has no attribute 'ANTIALIAS' のシグネチャが消えることを機械で確認しています。

verify — run-case.mjs
$ node run-case.mjs python/pillow-antialias-removed
● reproduce module 'PIL.Image' has no attribute 'ANTIALIAS' present ✓
● apply fix exit 0
● re-run module 'PIL.Image' has no attribute 'ANTIALIAS' gone ✓
PASS verified · python:3.11-slim · signature gone