---
title: "Pillowとは？Pythonの画像処理ライブラリの使い方をコード付きで解説【13.0.0対応】"
url: "https://www.issoh.co.jp/tech/details/1343/"
published: 2023-09-13
updated: 2026-10-24
categories: ["Python"]
publisher: "株式会社一創"
---

# Pillowとは？Pythonの画像処理ライブラリの使い方をコード付きで解説【13.0.0対応】

Pillow（ピロー）は、Pythonで画像を開いて加工し、保存するためのライブラリです。開発が止まった旧PIL（Python Imaging Library）を引き継いだもので、リサイズ・切り抜き・色調整・文字入れ・形式変換を数行で書けます。この記事では、2026年10月16日に公開されたPillow 13.0.0とPython 3.12を前提にコードを紹介します。13.0.0ではCriticalを含む多数の脆弱性が直っているため、12.3.0以前からの更新手順も新たにまとめました。ネットに残る古いサンプルが `ANTIALIAS` などで動かない理由と、その直し方も載せています。

## まとめ：Pillowの要点

- **正体**：旧PILのフォーク。パッケージ名は `Pillow`、importは `from PIL import Image`。読み方はピロー。
- **導入**：`pip install Pillow`。13.0.0はPython 3.11以上が必要。`pip install PIL` は入らない。
- **基本**：`Image.open()` で開き、加工メソッドで新しい画像を作り、`save()` で書き出す。
- **得意**：リサイズ、サムネイル、切り抜き、回転、明るさ調整、ぼかし、文字入れ、JPEG・PNG・WebP・AVIFの変換。
- **苦手**：物体検出や動画はOpenCV、画素の一括計算はNumPyに渡す。
- **つまずきやすい点**：RGBAはJPEGに保存できない、スマホ写真は向きを直す、日本語の文字入れはフォント指定が必須、10.0で消えたAPIを使う古いコードは書き換えが要る。
- **セキュリティ**：12.3.0以前にはCritical 2件を含む脆弱性があり、修正は13.0.0。ユーザーがアップロードした画像を開くシステムは優先して更新する。

## Pillowの位置づけ：旧PILを引き継いだPythonの画像処理ライブラリ

### PILとPillowの違いを開発の経緯・Python対応・import名で確認

PILはSecret Labs AB（PythonWare）が開発した画像処理ライブラリですが、[公式ドキュメントの説明](https://pillow.readthedocs.io/en/stable/about.html)どおり最後のリリースは2009年の1.1.7で、Python 3には対応していません。Pillowは2010年に始まったPILのフォークで、モジュール名 `PIL` を引き継いだため、PIL時代のコードの多くが `from PIL import Image` のまま動きます。2020年1月にはPyPI上の「PIL」プロジェクトの管理権もPillowチームへ移りましたが、更新の予定はありません。今から使うならPillow一択です。

### Pillowの最新版と対応Python・商用利用時のライセンス条件を確認

[PyPIのPillowページ](https://pypi.org/project/pillow/)によると、2026年10月23日時点の最新は10月16日公開の13.0.0で、要求するPythonは3.11以上です。[13.0.0のリリースノート](https://pillow.readthedocs.io/en/stable/releasenotes/13.0.0.html)には、2026年10月にサポートが切れたPython 3.10を外したことと、10月1日に正式版が出たPython 3.15を正式にサポートしたことが書かれています。ライセンスはMIT-CMUで、著作権表示と許諾文を残せば商用のソフトにも組み込めます。

Pillowは1月2日・4月1日・7月1日・10月15日の年4回に新版を出す決まりで、互換性を崩す変更はメジャー版（10.0・11.0・12.0・13.0）にまとめて入ります。13.0.0は予定より1日遅れの公開でした。12系の修正版（12.3.1など）は10月23日時点のPyPIに無く、脆弱性を直すには13.0.0へ上げるしかありません。Python 3.10の環境ではpipが13.0.0を選ばず12.3.0に留まるため、後述の手順でPythonごと上げる必要があります。

| 版      | 公開日        | 読者に影響する変更              |
| ------ | ---------- | ---------------------- |
| 9.1.0  | 2022-04-01 | 補間方法などの列挙型を追加          |
| 10.0.0 | 2023-07-01 | 旧補間定数・文字サイズ取得APIを削除    |
| 11.3.0 | 2025-07-01 | 配布wheelでAVIFの読み書きに対応   |
| 12.0.0 | 2025-10-15 | Python 3.9のサポート終了      |
| 12.3.0 | 2026-07-01 | 12系の最終版（脆弱性あり）         |
| 13.0.0 | 2026-10-16 | Python 3.10終了・脆弱性を一括修正 |

9.1.0で追加された列挙型には `Image.Resampling` などがあります。10.0.0で削除されたのは `ANTIALIAS`・`textsize()`・`getsize()` です。

## Pillowのインストール手順と実行環境・対応画像形式の動作確認

### pipによるPillowの導入手順とコマンドでの対応画像形式の確認

パッケージ名は `Pillow`、import名は `PIL` です。インストールしたら `python -m PIL` で版と、JPEG・WebP・AVIFなどの対応状況を一覧できます。

```
python -m pip install Pillow
python -m PIL            # 版と各形式の対応状況（--- WEBP support ok など）を表示
python -c "import PIL; print(PIL.__version__)"   # 13.0.0（2026年10月時点）
```

### `No module named 'PIL'`などの導入エラーと対処

- **`ModuleNotFoundError: No module named 'PIL'`**：Pillowの未インストールや、インストール先と実行に使うPythonの違いが原因として考えられます。`pip` 単体でなく、実行に使うPythonで `python -m pip install Pillow` を叩き直します。仮想環境やJupyterでは、そのカーネルのPythonで入れます。
- **`pip install PIL` が失敗する**：PyPIのPILにはダウンロードできるファイルが1つも無いため、必ず解決に失敗します。`Pillow` を指定します。
- **最新版が入らない**：pipは実行中のPythonが満たす範囲で一番新しい版を選びます。Python 3.10なら12系の12.3.0、Python 3.9なら11系の11.3.0が入り、13.0.0は入りません。13系を使うならPythonを3.11以上に上げます。

## Pillowで画像を読み込み・表示・保存する基本操作とサイズの確認

`Image.open()` はファイルの先頭だけを読んで形式とサイズを判定し、画素は加工や保存のときに初めて読み込みます。ファイルを閉じ忘れないよう `with` で開くのが安全です。

```
from PIL import Image

with Image.open("photo.jpg") as img:
    print(img.size, img.format, img.mode)  # (4032, 3024) JPEG RGB
    img.show()                             # OS標準のビューアで表示
    img.save("photo.png")                  # 拡張子から形式を判定して保存
    img.save("small.jpg", quality=85)      # JPEGの画質（既定は75）
```

`size` は（幅, 高さ）の順で、NumPyの（高さ, 幅）と逆になる点に注意してください。

### 画像モード（RGB・RGBA・L・P）の違いと加工・保存前の変換

`mode` は画素の持ち方を表します。写真はRGB、透過付きPNGはRGBA、グレースケールはL、色数を絞ったGIFや一部のPNGはP（パレット）です。加工や保存の前に `convert()` でモードを揃えると、多くのエラーを避けられます。

```
gray = img.convert("L")        # グレースケール
with Image.open("logo.png") as png_img:
    rgb = png_img.convert("RGB")   # アルファを除去してRGBに変換
```

## 画像のリサイズ・切り抜き・回転で使うメソッドと縦横比・向きの扱い

### resizeとthumbnailの使い分けを縦横比・戻り値・元画像で判断

`resize()` は指定したサイズに変形した新しい画像を返し、縦横比は守りません。`thumbnail()` は縦横比を保ったまま指定の枠に収まるよう縮め、元の画像そのものを書き換えて `None` を返します。一覧用の縮小画像なら `thumbnail()`、サイズを厳密に揃えたいなら `resize()` です。

```
from PIL import Image

img = Image.open("photo.jpg")                    # 4032x3024

fixed = img.resize((800, 600), Image.Resampling.LANCZOS)

w, h = img.size                                  # 幅800で縦横比を保つ
keep = img.resize((800, round(h * 800 / w)))

thumb = img.copy()                               # 元を残すならcopyしてから
thumb.thumbnail((800, 800))                      # -> 800x600、戻り値はNone
```

RGB画像では、補間方法を省くと `resize()` は `BICUBIC` を使います。ただし、モード1・Pで使われるのは `NEAREST` です。縮小の画質を優先するなら `Image.Resampling.LANCZOS` を指定します。13.0.0では、Magic Kernel Sharp系の `Image.Resampling.MKS2013` と `MKS2021` も `resize()` と `thumbnail()` で選べるようになりました。

### 切り抜き（crop）の座標指定と回転・反転時の四隅や画質の扱い

`crop()` は（左, 上, 右, 下）の座標で範囲を指定します。`rotate()` は反時計回りで、四隅が切れるのを防ぐ指定は `expand=True` です。90度単位の回転や左右反転は、画質が落ちない `transpose()` を使います。

```
face = img.crop((100, 100, 900, 700))                  # 800x600を切り出す
tilted = img.rotate(45, expand=True, fillcolor="white")
mirror = img.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
```

### EXIFによるスマホ写真の向き補正と保存前に行うOrientationの処理

スマートフォンの写真は、画素を横向きのまま保存し、表示の向きをEXIFのOrientationタグで指示していることがあります。Pillowは開いただけでは向きを反映しないため、リサイズして保存すると横倒しの画像ができます。開いた直後に `ImageOps.exif_transpose()` を通してください。

```
from PIL import Image, ImageOps

with Image.open("iphone.jpg") as img:
    img = ImageOps.exif_transpose(img)   # Orientation=6なら400x300 -> 300x400に回転
    img.thumbnail((1200, 1200))
    img.save("iphone_small.jpg", quality=85)
```

Orientation=6を付けた400×300の画像で試すと（12.3.0で実測）、変換後は300×400になり、Orientationタグも取り除かれました。

## 色調整とフィルタ（ImageEnhance・ImageFilter・ImageOps）

明るさ・コントラスト・彩度は `ImageEnhance` で、1.0を基準に倍率で指定します。ぼかしやシャープ化は `ImageFilter`、グレースケール化や自動コントラストのような定番処理は `ImageOps` にまとまっています。

```
from PIL import Image, ImageEnhance, ImageFilter, ImageOps

img = Image.open("photo.jpg")
img = ImageEnhance.Brightness(img).enhance(1.2)   # 20%明るく
img = ImageEnhance.Contrast(img).enhance(1.1)
img = ImageEnhance.Color(img).enhance(0.8)        # 彩度を下げる（0で白黒）

blur = img.filter(ImageFilter.GaussianBlur(radius=3))
sharp = img.filter(ImageFilter.UnsharpMask(radius=2, percent=150, threshold=3))
auto = ImageOps.autocontrast(img, cutoff=1)       # 明暗の両端1%を切って伸ばす
```

13.0.0からは、`ImageOps.invert()`・`posterize()`・`solarize()` がPモード（パレット）の画像にも使えます。12系まではPモードを渡すと `NotImplementedError` になり、先にRGBへ変換する必要がありました。

## 日本語の文字入れと画像の合成で指定するフォント・透過レイヤーの扱い

### ImageDrawによる日本語描画と文字化けを防ぐフォントファイルの指定

文字や図形は `ImageDraw` で描きます。フォントを指定しないと `ImageFont.load_default()` の欧文フォントが使われ、日本語は豆腐（□）で描かれます。12.3.0で実行すると、エラーは出ずに「日」も制御文字と同じ大きさの箱になりました。日本語を入れるときは、日本語フォントのファイルを `truetype()` で必ず指定します。

```
from PIL import Image, ImageDraw, ImageFont

img = Image.open("photo.jpg").convert("RGBA")
# Windows: C:\Windows\Fonts\meiryo.ttc、Linux: Noto Sans CJKのパス
font = ImageFont.truetype("/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc", 96)

layer = Image.new("RGBA", img.size, (0, 0, 0, 0))   # 半透明の文字用レイヤー
draw = ImageDraw.Draw(layer)
text = "© 2026 サンプル"
left, top, right, bottom = draw.textbbox((0, 0), text, font=font)
x = img.width - right - 40                          # 右下に40pxの余白で置く
y = img.height - bottom - 40                        # bboxの原点ずれも差し引く
draw.text((x, y), text, font=font, fill=(255, 255, 255, 160))

Image.alpha_composite(img, layer).convert("RGB").save("watermarked.jpg", quality=90)
```

文字の大きさは `textbbox()` で測ります。古い記事にある `textsize()` は10.0で削除済みです。

### ロゴの透過合成（paste・alpha\_composite）

透過PNGのロゴを写真に重ねるときは、`paste()` の第3引数にロゴ自身を渡すと、アルファチャンネルがマスクとして効きます。RGB画像への貼り付けで省くと、透過部分もロゴが持つRGB値で上書きされる動作です。半透明同士をきれいに重ねたいときは、両方をRGBAにして `Image.alpha_composite()` を使います。

```
base = Image.open("photo.jpg")
logo = Image.open("logo.png")          # RGBA
base.paste(logo, (50, 50), logo)       # 左上(50,50)に透過を保って貼る
base.save("with_logo.jpg")
```

## JPEG・PNGなどの画像形式の変換とフォルダ内の画像の一括処理

### JPEG・PNG・WebP・AVIFの保存オプションと透過・対応環境の確認

形式は `save()` の拡張子で決まり、形式ごとにオプションが変わります。AVIFは11.3.0から対応する配布wheelに同梱されています。環境による違いがあるため、`python -m PIL` でAVIF対応を確認してください。

| 形式   | 透過 | 主なオプション                     |
| ---- | -- | --------------------------- |
| JPEG | 不可 | `quality`（既定75）・`optimize`  |
| PNG  | 可  | `optimize`・`compress_level` |
| WebP | 可  | `quality`・`lossless=True`   |
| AVIF | 可  | `quality`（11.3.0以降のwheel）   |
| HEIC | 可  | pillow-heifが必要              |

iPhoneのHEIC写真は、Pillow単体では開けません。[pillow-heif](https://pypi.org/project/pillow-heif/)（2026年10月時点で1.8.1）を入れて登録すると、`Image.open()` でそのまま読めます。

```
pip install pillow-heif
```

```
from pillow_heif import register_heif_opener
from PIL import Image

register_heif_opener()
Image.open("IMG_0001.HEIC").convert("RGB").save("IMG_0001.jpg", quality=90)
```

### フォルダ内のJPEG画像を向き補正・縮小してWebPへ一括変換する手順

複数ファイルは `pathlib` で回します。向きの補正、縮小、RGB化、WebP保存を1つのループにまとめた例です。

```
from pathlib import Path
from PIL import Image, ImageOps

src, dst = Path("photos"), Path("webp")
dst.mkdir(exist_ok=True)

for path in src.glob("*.jpg"):
    with Image.open(path) as img:
        img = ImageOps.exif_transpose(img)
        img.thumbnail((1600, 1600))
        img.convert("RGB").save(dst / f"{path.stem}.webp", quality=80)
```

Webサイトの画像を配信時に変換したいだけなら、Pillowで事前に変換するより、[Cloudinaryの画像変換URLの書き方とクレジット料金](/tech/details/17683/)のような変換サービスに任せる方が運用は軽くなります。

## 画像処理の目的に応じたOpenCV・NumPyとの使い分けと相互変換

Pillowは「開く・整える・書き出す」に絞ったライブラリで、画像認識は持っていません。物体検出や輪郭抽出、動画の処理は [OpenCVをPythonで使う画像処理入門](/tech/details/1344/) で扱うOpenCVに、画素の一括計算はNumPyに任せ、画像の入出力にはPillowを使い、必要な処理に合わせて相互変換します。

| やりたいこと         | 向くライブラリ              |
| -------------- | -------------------- |
| リサイズ・形式変換・文字入れ | Pillow               |
| 顔検出・輪郭抽出・動画    | OpenCV               |
| 画素ごとの計算・統計     | NumPy                |
| 文字認識（OCR）      | Tesseract＋Pillowで前処理 |

```
# 事前に実行: python -m pip install numpy opencv-python
import numpy as np
import cv2
from PIL import Image

arr = np.asarray(Image.open("photo.jpg"))           # shape=(3024, 4032, 3) 高さ,幅,色
bgr = cv2.cvtColor(arr, cv2.COLOR_RGB2BGR)          # OpenCVはBGR順
back = Image.fromarray(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
```

OpenCVの `imread()` はBGR順で画素を持つので、変換を挟まずにPillowへ渡すと赤と青が入れ替わります。Pillow自体に文字認識の機能は無く、OCRは [Tesseract OCRの使い方](/tech/details/8204/) で紹介しているTesseractを呼び、Pillowはグレースケール化や拡大などの前処理を担います。画面のスクリーンショットから画像を探す用途なら、Pillowを内部で使う [PyAutoGUIのインストールと使い方](/tech/details/3600/) や、[テンプレートマッチングの仕組みと類似度指標の選び方](/tech/details/16853/) が近い話題です。

## Pillow 13.0.0で直った脆弱性と12.3.0以前からの更新手順

13.0.0のリリースノートには、セキュリティ修正が38項目（Critical 2・High 13・Medium 20・Low 3）並んでいます。多くは細工した画像ファイルを開いたときのメモリ破壊や、CPU・メモリを食い潰すサービス妨害です。GitHubのアドバイザリでは、ほぼすべての影響範囲が「12.3.0以下」で、修正版は13.0.0とされています。13.0.0で修正された脆弱性と影響確認の手順は、[Pillow 脆弱性の解説記事（13.0.0で直った42件の影響確認とPython 3.10環境の更新手順）](https://www.issoh.co.jp/tech/details/18837/)にまとめています。

### Critical 2件の脆弱性の中身と画像読込で影響を受ける使い方

| 識別子             | 影響する版         | 中身                    |
| --------------- | ------------- | --------------------- |
| CVE-2026-96639  | 11.0.0〜12.3.0 | 複数フレーム画像の読込でヒープ破壊     |
| CVE-2026-112398 | 12.3.0以下      | FlashPix読込のヒープオーバーフロー |

1件目の [GHSA-v9pv-5gc8-w2m6](https://github.com/python-pillow/Pillow/security/advisories/GHSA-v9pv-5gc8-w2m6)（CVSS 9.8）は、PSD・MPO・DCXなど複数のフレームを持つ形式で起きます。最初のフレームで確保した狭いモード（Lなど）の領域を、後のフレームで広いモード（RGBやCMYK）に切り替えた際に使い回し、領域の外への書き込みが起きる仕組みです。報告者は12.3.0のMPO経路で、`ImageSequence.Iterator` でフレームを順に読むだけでコマンド実行まで到達できたと書いています。

2件目の [GHSA-5x8w-8jj5-q52h](https://github.com/python-pillow/Pillow/security/advisories/GHSA-5x8w-8jj5-q52h) は、FlashPix（FPX）形式のJPEGタイルを展開する処理のバッファあふれです。形式は拡張子でなくファイル先頭のOLE2署名で判定されるため、`.jpg` を名乗るファイルでも、任意依存の `olefile` が入っていれば `Image.open()` だけで到達します。サムネイル生成のように、ユーザーがアップロードした画像を開くWebサービスは真っ先に対象になります。

### 13.0.0への更新コマンドとPython 3.10環境の扱い

まず実行環境の版と、FPXの入口になる `olefile` の有無を確かめ、13.0.0以上へ上げます。requirementsやpyproject.tomlの下限も一緒に上げておくと、別の環境で古い版が入り直す事故を防げます。

```
python -c "import sys, PIL; print(sys.version_info[:2], PIL.__version__)"
python -m pip show olefile               # 入っていればFPXが読める状態
python -m pip install --upgrade "Pillow>=13.0.0"

# requirements.txt
Pillow>=13.0.0
```

Python 3.10のままでは、`Pillow>=13.0.0` を指定しても対応する配布ファイルが見つからず、インストールは失敗します。下限を書かずに `--upgrade` だけ実行すると、エラーも出ずに12.3.0のまま残るので注意してください。Python 3.11以上へ上げるのが本筋で、すぐに上げられない場合は、信頼できない画像を開く処理だけでも3.11以上の別環境へ切り出します。

Pillowのように依存の奥にあるライブラリの脆弱性は、気付くまでに時間がかかります。[Dependabotの設定とRenovateとの違い](/tech/details/6796/)で紹介している自動更新のプルリクエストや、[OSV-Scannerの使い方とGitHub Actions設定](/tech/details/12926/)で紹介している依存関係のスキャンをCIに組み込んでおくと、今回のような一括修正にもすぐ追随できます。

### 信頼できない画像を開く処理の守り方と読込形式の制限（formats指定）

[Image.open() のリファレンス](https://pillow.readthedocs.io/en/stable/reference/Image.html)にあるとおり、`formats` 引数で判定を試す形式を絞れます。アップロード画像をJPEG・PNG・WebPに限るサービスなら、FPXやPSD、TIFFの読込処理にそもそも入らなくなり、攻撃面が狭まります。

```
from PIL import Image, UnidentifiedImageError

ALLOWED = ("JPEG", "PNG", "WEBP")

def open_upload(path):
    try:
        img = Image.open(path, formats=ALLOWED)   # 許可外の形式は判定しない
        img.load()                                # 画素をここで読み切る
        return img
    except (UnidentifiedImageError, Image.DecompressionBombError):
        raise ValueError("対応していない画像です")
```

ただし、形式の制限は更新の代わりにはなりません。JPEGの展開処理自体にもHigh評価の修正（GHSA-8g5g-8vmr-9782など）が入っているため、13.0.0への更新を先に済ませ、そのうえで形式の制限と後述の画素数上限を重ねます。なお10月23日時点で、Arrow形式への書き出しで初期化前のメモリが漏れる問題（GHSA-654x-cwwv-5j9c、Medium）は13.0.0でも未修正と公開されています。環境変数 `PILLOW_ALIGNMENT` を1より大きくしている場合に限られるため、既定の設定なら影響しません。

### 13.0.0で変わった互換性と画像保存・API移行時に確認する注意点

メジャー版のため、動きが変わる箇所もあります。12.3.0から上げるときに確認したい主な変更は次のとおりです。

- **IモードのPNG保存**：32ビットの値を16ビットへ黙って切り詰める処理をやめました。保存前に `im.convert("I;16")` などで変換します。
- **`get_child_images()`**：`Image.Image` から `ImageFile.ImageFile` へ移りました。ファイルから開いた画像でだけ使えます。
- **削除されたもの**：`Image._show`（`show()` を使う）、`ExifTags.IFD.Makernote`（`MakerNote` を使う）など。
- **TIFFの重複タグ**：同じタグが複数ある場合、後勝ちから先勝ちに変わりました。
- **import時間**：リリースノートの計測では、`from PIL import Image` が12.3.0の約半分の時間になりました。

## 古いコードが動かない原因と画像の保存で失敗しやすい箇所の直し方

Pillowの検索で出てくる解説記事やQ&Aには、10.0より前に書かれたものが多く残っています。12.3.0で実行して確かめた、つまずきやすいエラーと直し方は次のとおりです。いずれも13.0.0で戻された変更ではありません。

| エラー・症状                     | 原因              | 直し方                        |
| -------------------------- | --------------- | -------------------------- |
| `no attribute 'ANTIALIAS'` | 10.0で削除         | `Image.Resampling.LANCZOS` |
| `no attribute 'textsize'`  | 10.0で削除         | `draw.textbbox()`          |
| `no attribute 'getsize'`   | 10.0で削除         | フォントの外接矩形・文字送り長を取得         |
| RGBA画像のJPEG保存エラー           | JPEGは透過不可       | `convert("RGB")`           |
| 保存後に撮影情報が消える               | EXIFは自動で引き継がれない | `exif=img.getexif()`       |
| `DecompressionBombError`   | 画素数の上限超え        | 上限を見直す                     |

フォントの文字サイズ取得では `font.getbbox()`・`getlength()` に移行します。RGBA画像をJPEGで保存した際のエラー文は `cannot write mode RGBA as JPEG` です。

削除されたAPIの一覧と移行先は、[Pillow 10.0.0のリリースノート](https://pillow.readthedocs.io/en/stable/releasenotes/10.0.0.html)に表でまとまっています。

EXIFは `save()` に渡さない限り書き出されません。メーカー名を入れたJPEGを開いてそのまま保存すると、EXIFは空になりました。撮影日時や位置情報を残したいなら `exif=` を渡し、逆に公開前に位置情報を消したいなら渡さずに保存します。

`DecompressionBombError` は、極端に大きな画像でメモリを食い潰す攻撃への防御です。`Image.MAX_IMAGE_PIXELS` の既定は89,478,485画素で、超えると警告、その2倍を超えると例外になります。航空写真のように正当に大きい画像だけを扱う処理なら上限を上げてよいですが、ユーザーがアップロードした画像を開くWebアプリで `None`（無制限）にするのは避けてください。13.0.0ではSPIDER・MPO・DCX・APNGなどで、この上限をすり抜けられた経路も塞がれています。

画像のアップロードや変換を含む業務システムを作る場合、ここで挙げた上限設定やEXIFの扱い、ライブラリの更新方針は要件として最初に決めておく項目です。設計から相談したい場合は [フルスクラッチ開発](/service/system/fullscratch/) の支援内容をご覧ください。

## よくある質問

### Pillowの読み方は何ですか？

「ピロー」と読みます。英語の pillow（枕）と同じ綴りで、import名の `PIL` は「ピル」と読まれることが多いです。

### PillowとPILの違いは何ですか？

PILは2009年の1.1.7を最後にリリースが止まった元のライブラリ、Pillowはそれを引き継いで更新が続くフォークです。Python 3で使えるのはPillowだけで、importは両者とも `from PIL import Image` です。

### PillowとOpenCVはどちらを使うべきですか？

リサイズや形式変換、文字入れが目的ならPillowで足ります。顔検出や輪郭抽出、動画処理が要るならOpenCVです。両方使う場合は、OpenCVがBGR順で画素を持つ点に注意して相互変換します。

### Pillowのライセンスは商用利用できますか？

できます。ライセンスはMIT-CMUで、目的を問わず無償での使用・改変・再配布が認められています。条件は、著作権表示と許諾文を複製物と付属文書に残すことと、作者名を許可なく宣伝に使わないことです。

### Pillow 12.3.0以前を使い続けても大丈夫ですか？

自分で用意した画像だけを扱うバッチなら直ちに危険とは限りませんが、外部から受け取った画像を開くなら13.0.0へ上げてください。12.3.0以下にはCritical 2件を含む脆弱性があり、12系の修正版は2026年10月23時点で出ていません。Python 3.10では13.0.0が入らないため、Pythonの更新も合わせて計画します。

## 関連記事

- [OpenCVとは？Pythonでの使い方入門｜pip installから画像処理・顔検出まで【5.0対応】](/tech/details/1344/)
- [Tesseract OCRの使い方｜インストール・日本語設定・コマンドとPython/C#連携【5.5.3対応】](/tech/details/8204/)
- [PyAutoGUIとは？インストールと使い方｜マウス・キーボード操作と0.9.54の落とし穴](/tech/details/3600/)
- [テンプレートマッチングとは？matchTemplateの仕組みと類似度指標の選び方を解説](/tech/details/16853/)
- [Dependabotとは｜料金は無料・dependabot.ymlの書き方とRenovateとの違い【2026年10月】](/tech/details/6796/)
- [OSV-Scannerの使い方｜インストール・コマンド・GitHub Actions設定とTrivyとの違い【v2.7.0】](/tech/details/12926/)

---

出典: [Pillowとは？Pythonの画像処理ライブラリの使い方をコード付きで解説【13.0.0対応】](<https://www.issoh.co.jp/tech/details/1343/>)（株式会社一創）
