Pillowとは?Pythonで画像を加工する使い方をコード付きで解説
Pillowは、Pythonで画像の読み込み・加工・保存を手軽に行える画像処理ライブラリです。リサイズや切り抜き、色調整、フィルタ、文字入れ、フォーマット変換といった定番の処理を数行のコードで実装できます。この記事では、Pillowとは何かという基礎から、インストール、画像の開き方・保存、主要な加工テクニック、フォーマット変換と一括処理、そしてOpenCVやNumPyとの使い分けまで、実際に動くコード付きで解説します。バージョンは2026年時点の最新12.3.0(Python 3.10以上)を前提とします。
まとめ:Pillowの要点
- 正体:Pythonの画像処理ライブラリ。旧PIL(Python Imaging Library)の後継フォークで、
from PIL import Imageで使う。 - 導入:
pip install Pillow。最新は12.3.0で、Python 3.10以上が必要。 - 基本の型:「開く(Image.open)→加工→保存(save)」の3ステップ。
- 主用途:リサイズ・切り抜き・回転、明るさ/コントラスト/彩度の調整、フィルタ、文字入れ、JPEG/PNG/WebP変換。
- 苦手:物体検出などの高度な画像認識や動画処理はOpenCV、画素単位の数値演算はNumPyが向く。
- 注意:JPEGは透過を保存できないため、RGBAの画像は
convert('RGB')してから保存する。
Pillowとは(PILの後継ライブラリ)
Pillowは、開発が止まった旧PILを引き継いだフォークで、現在のPythonで画像処理といえば実質的にPillowを指します。中心となるのは Image オブジェクトで、ファイルやバイト列から画像を読み込み、加工して書き出します。JPEG・PNG・GIF・WebP・TIFF・BMPなど主要フォーマットに対応し、拡張プラグインを入れればHEIFなども扱えます。純粋な画像加工とフォーマット変換に絞れば、少ないコードで完結するのが強みです。
Pillowのインストールと基本操作
インストールはpipで行います。パッケージ名は「Pillow」ですが、importするモジュール名は歴史的経緯から PIL です。
pip install Pillow
画像を開いてサイズや形式を確認し、別名で保存する基本の流れは次のとおりです。
from PIL import Image
img = Image.open("photo.jpg")
print(img.size, img.format, img.mode) # (幅, 高さ) 'JPEG' 'RGB'
img.save("output.png") # 拡張子で形式を判定して保存
主要な画像加工テクニック
リサイズ・切り抜き・回転
サイズ変更は resize、一部の切り抜きは crop(左・上・右・下の座標)、回転は rotate を使います。縦横比を保って縮小するだけなら thumbnail が簡単です。
img.resize((800, 600)).save("resized.jpg")
img.crop((0, 0, 400, 300)).save("cropped.jpg") # 左上から400x300を切り出し
img.rotate(90, expand=True).save("rotated.jpg") # 反時計回り。expand=Trueで見切れ防止
thumb = img.copy()
thumb.thumbnail((256, 256)) # 縦横比を保ち最大256pxに収める
thumb.save("thumb.jpg")
明るさ・コントラスト・彩度の調整
色味の調整は ImageEnhance を使い、1.0を基準に倍率を指定します。1.0より大きいと強調、小さいと減衰です。
from PIL import ImageEnhance
img2 = ImageEnhance.Brightness(img).enhance(1.3) # 明るさ+30%
img2 = ImageEnhance.Contrast(img2).enhance(1.2) # コントラスト+20%
img2 = ImageEnhance.Color(img2).enhance(0.8) # 彩度-20%
img2.save("adjusted.jpg")
ぼかし・シャープ化(ImageFilter)
ぼかしやシャープ化は ImageFilter のフィルタを filter に渡します。ぼかし量を指定できる GaussianBlur がよく使われます。
from PIL import ImageFilter
img.filter(ImageFilter.GaussianBlur(2)).save("blur.jpg")
img.filter(ImageFilter.SHARPEN).save("sharpen.jpg")
文字入れ(透かし・キャプション)
画像への文字入れは ImageDraw と ImageFont を使います。日本語を入れるには、日本語フォントのttfファイルを指定します(フォントを指定しないと既定フォントになり日本語が出ないことがあります)。
from PIL import ImageDraw, ImageFont
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("NotoSansJP-Regular.ttf", 32)
draw.text((20, 20), "サンプル", fill="white", font=font)
img.save("captioned.jpg")
画像フォーマット変換と一括処理
フォーマット変換は保存時の拡張子(または format 引数)で決まります。JPEGは透過を保存できないため、PNGなどRGBAの画像はRGBへ変換してから保存します。JPEGの圧縮率は quality で調整します。
# PNG(透過あり)をJPEGへ:先にRGBへ変換
Image.open("icon.png").convert("RGB").save("icon.jpg", quality=85)
フォルダ内の画像をまとめて変換するときは、globでファイルを列挙してループします。パス区切りはOSに依存しないよう os.path を使うと安全です。
import glob, os
os.makedirs("out", exist_ok=True)
for path in glob.glob(os.path.join("input", "*.png")):
name = os.path.splitext(os.path.basename(path))[0]
Image.open(path).convert("RGB").save(os.path.join("out", name + ".jpg"), quality=85)
iPhoneのHEIC/HEIFを扱う場合は、pip install pillow-heif でプラグインを追加し、登録するとPillowから開けるようになります。
PillowとOpenCV・NumPyの使い分け
「Pythonで画像を扱う」ライブラリは複数あり、目的で選び分けると迷いません。
| ライブラリ | 得意 | 向く用途 |
|---|---|---|
| Pillow | 手軽な加工・フォーマット変換 | リサイズ・文字入れ・一括変換 |
| OpenCV | コンピュータビジョン・動画 | 物体検出・輪郭・カメラ処理 |
| NumPy | 画素の配列演算 | ピクセル単位の高速計算 |
PillowとNumPyは numpy.array(img) で相互変換でき、画素演算だけNumPyに任せて結果をPillowで保存する併用も定番です。より高度な画像処理に踏み込むならOpenCVを使った画像加工の応用テクニックが参考になります。
よくある質問
PillowとPILの違いは何ですか?
PILは開発停止した旧ライブラリで、Pillowはその後継フォークです。現在Pythonで画像処理を行う場合はPillowを使い、importは互換のため PIL のままです。
Pillowのインストール方法は?
pip install Pillow でインストールします。最新版は12.3.0で、Python 3.10以上が必要です。コード内では from PIL import Image のように PIL を読み込みます。
Pillowはどの画像フォーマットに対応していますか?
JPEG・PNG・GIF・WebP・TIFF・BMPなど主要フォーマットに標準対応します。HEIF/HEICは pillow-heif プラグインを追加すると扱えます。
PillowとOpenCVはどちらを使うべきですか?
リサイズや文字入れ、フォーマット変換など一般的な加工はPillowが手軽です。物体検出や動画処理などコンピュータビジョン寄りの処理はOpenCVが適します。
PillowでOCR(文字認識)はできますか?
Pillow自体はOCR機能を持ちません。画像の前処理(グレースケール化やトリミング)をPillowで行い、文字認識はpytesseractなどのOCRライブラリに渡すのが一般的です。OCRの導入事例はAI-OCRの事例紹介で扱っています。