【Pillow入門 第1回】Pythonで画像処理をはじめよう!読み込み・リサイズ・回転・切り抜きも自由自在 🖼️✨

「ブログにアップロードする画像のサイズを、全部まとめて小さくしたいな…」
「写真の一部だけを切り抜いて、アイコンを作ってみたい!」
「Pythonで画像を扱うって、なんだか面白そうだけど難しそう…」

こんにちは! Pythonistaの皆さん、今日から新しいシリーズ「Pillow入門」を始めます! これまで私たちは数値やテキスト、ファイルシステムなどを扱ってきましたが、今回はより視覚的でクリエイティブな世界、画像処理に挑戦します。その強力なパートナーとなるのが、Pythonで画像処理を行う際のデファクトスタンダード(事実上の標準)ライブラリ、Pillow (ピロー) です。

このPillow入門シリーズでは、数回にわたってPillowの基本的な使い方から応用までを解説していきます。記念すべき第1回の今回は、画像処理の本当に基本的な操作に絞って学びます。この記事を読み終える頃には、あなたはPythonを使って、画像の読み込み、表示、保存はもちろん、リサイズ、回転、トリミング(切り抜き)といった最もよく使うであろう操作が自由自在にできるようになっているはずです。さあ、Pythonで画像と戯れる楽しい時間の始まりです!


1. Pillow (PIL Fork) とは?

Pillow (ピロー) は、Pythonで画像処理を行うための非常に強力でポピュラーなライブラリです。元々はPIL (Python Imaging Library) というライブラリがありましたが、その開発が停滞してしまったため、そのフォーク(分岐)プロジェクトとしてPillowが誕生しました。現在では、PillowがPILの後継として活発に開発されており、「Pythonで画像処理」と言えば、まずPillowが挙げられるほどの定番ライブラリとなっています。

Pillowを使えば、多種多様な画像フォーマットの読み書き、リサイズや回転といった変形、カラーモードの変換、フィルター処理、さらには画像への描画など、画像に関するありとあらゆる操作が可能です。


2. Pillowのインストール:画像処理の世界へようこそ

Pillowは外部ライブラリなので、利用する前にインストールが必要です。Pythonのパッケージ管理ツールであるpipを使って、ターミナルやコマンドプロンプトから以下のコマンドを実行してください。

pip install Pillow

大文字の「P」で始まる点に注意してください。これだけでインストールは完了です! インストールが成功したかを確認するには、Pythonの対話モードなどで以下を実行し、エラーが出なければOKです。

from PIL import Image

インポートする際には、ライブラリ名がPILとなる点も覚えておきましょう。


3. 画像の読み込み・表示・保存:基本の3ステップ

画像処理の基本は、ファイルを読み込み、何らかの処理を加え、結果を保存するという流れです。まずはこの基本の3ステップをマスターしましょう。

3.1. 準備:画像ファイルの用意とモジュールのインポート

まず、処理の対象となる何か画像ファイル(例: sample.jpgcat.png など)を、これから作成するPythonスクリプトと同じディレクトリに用意してください。インターネットからダウンロードしたフリー素材の写真などでも構いません。

そして、Pillowの主要なクラスであるImageをインポートします。

from PIL import Image

3.2. 画像の読み込み (Image.open()) と基本情報の取得

画像ファイルを開くには、Image.open()関数を使います。これにより、画像データが格納された「Imageオブジェクト」が返されます。

from PIL import Image
import os

image_path = 'sample.jpg' # あなたが用意した画像ファイル名に置き換えてください

try:
    # with構文を使うと、処理が終わった後に自動でファイルを閉じてくれるので安全です
    with Image.open(image_path) as img:
        print(f"--- 画像 '{image_path}' の情報 ---")
        
        # .format: 画像のフォーマット (JPEG, PNGなど)
        print(f"フォーマット: {img.format}")
        
        # .size: 画像のサイズ (幅, 高さ) をタプルで取得
        print(f"サイズ (幅, 高さ): {img.size}")
        
        # .mode: カラーモード (RGB, RGBA, L(グレースケール)など)
        print(f"カラーモード: {img.mode}")
        
except FileNotFoundError:
    print(f"エラー: ファイル '{image_path}' が見つかりません。")
except Exception as e:
    print(f"エラーが発生しました: {e}")

このImageオブジェクト(この例ではimg変数)に対して、様々な操作を行っていきます。

3.3. 画像の表示 (img.show())

読み込んだ画像を確認するには、show()メソッドが便利です。このメソッドを実行すると、お使いのOSのデフォルトの画像ビューアが起動して画像が表示されます。

# 上記のコードに続けて...
# if 'img' in locals():
#     img.show() # 画像ビューアで画像が開く
print("img.show() を実行すると、画像ビューアで画像が表示されます。")

ヒント: Jupyter NotebookやGoogle Colabのような環境では、セルの最後にImageオブジェクトの変数名(この場合はimg)を置くだけで、その場に画像が表示されます。

3.4. 画像の保存 (img.save())

処理を加えた画像を新しいファイルとして保存するには、save()メソッドを使います。

from PIL import Image

image_path = 'sample.jpg'
output_path_png = 'sample_converted.png'
output_path_jpg_low = 'sample_low_quality.jpg'

try:
    with Image.open(image_path) as img:
        # 拡張子を変えるだけで、フォーマット変換して保存できる!
        img.save(output_path_png)
        print(f"\n'{output_path_png}' としてPNG形式で保存しました。")
        
        # JPEG形式で保存する際に品質を指定する (0-100, 数値が高いほど高品質)
        img.save(output_path_jpg_low, quality=20) # 品質を落としてファイルサイズを小さくする
        print(f"'{output_path_jpg_low}' として低品質JPEGで保存しました。")
except FileNotFoundError:
    print(f"エラー: ファイル '{image_path}' が見つかりません。")

save()メソッドは非常に賢く、指定したファイル名の拡張子から自動的にファイル形式を判断してくれます。JPEGからPNGへの変換などもこの通り簡単です。


4. 超基本の画像操作:リサイズ・回転・トリミング

ここからは、画像の変形操作で最もよく使われる3つの機能を見ていきましょう。

4.1. 画像のリサイズ (resize())

画像のサイズを変更します。サムネイル作成や、Webサイトにアップロードする前の画像サイズの統一などに便利です。

from PIL import Image

image_path = 'sample.jpg'
output_path_resized = 'sample_resized.jpg'

with Image.open(image_path) as img:
    print(f"\n元のサイズ: {img.size}")
    
    # 新しいサイズをタプル (幅, 高さ) で指定
    new_size = (300, 200)
    resized_img = img.resize(new_size)
    
    print(f"リサイズ後のサイズ: {resized_img.size}")
    resized_img.save(output_path_resized)
    print(f"リサイズした画像を '{output_path_resized}' に保存しました。")
    # resized_img.show()

ヒント: 元画像の縦横比(アスペクト比)を維持したままリサイズしたい場合は、まず片方の辺の長さを決め、もう片方を計算する必要があります。例えば、幅を300pxに固定する場合は、新しい高さ = 元の高さ * (300 / 元の幅) のように計算します。

4.2. 画像の回転 (rotate())

画像を回転させます。角度は反時計回りで指定します。

from PIL import Image

image_path = 'sample.jpg'
output_path_rotated = 'sample_rotated.jpg'
output_path_rotated_expanded = 'sample_rotated_expanded.jpg'

with Image.open(image_path) as img:
    # 45度、反時計回りに回転
    rotated_img = img.rotate(45)
    rotated_img.save(output_path_rotated)
    print(f"\n45度回転した画像を '{output_path_rotated}' に保存しました。")
    # この場合、元の画像の枠からはみ出た部分は切り取られます。
    
    # expand=True を指定すると、画像全体が収まるようにキャンバスサイズが自動で拡張される
    rotated_expanded_img = img.rotate(45, expand=True)
    rotated_expanded_img.save(output_path_rotated_expanded)
    print(f"45度回転し拡張した画像を '{output_path_rotated_expanded}' に保存しました。")

↑通常の45度回転 ↓expand=True


4.3. 画像のトリミング/切り抜き (crop())

画像の一部を四角形に切り抜きます。SNSのアイコン作成などで特定の領域だけを使いたい場合に便利です。

crop()メソッドには、切り抜きたい領域を(左のx座標, 上のy座標, 右のx座標, 下のy座標)という4つの値を持つタプルで指定します。座標系は、画像の左上が原点(0, 0)です。

from PIL import Image

image_path = 'sample.jpg'
output_path_cropped = 'sample_cropped.jpg'

with Image.open(image_path) as img:
    # 切り抜く領域を指定 (left, upper, right, lower)
    box = (2000, 2000, 3500, 3500) # (x1, y1, x2, y2) で範囲指定
    cropped_img = img.crop(box) # boxで指定した範囲で切り取り
    
    print(f"\n元のサイズ: {img.size}")
    print(f"切り抜き後のサイズ: {cropped_img.size}") 
    cropped_img.save(output_path_cropped)
    print(f"切り抜いた画像を '{output_path_cropped}' に保存しました。")
    # cropped_img.show()
 
↑元画像 ↓クロップ(切り取り)後



5. 実践!ここまでの操作を組み合わせてみよう

最後に、これまでに学んだ操作を組み合わせて、一連の画像処理を行ってみましょう。

from PIL import Image

image_path = 'sample.jpg'
final_output_path = 'final_processed_image.png'

with Image.open(image_path) as img:
    print(f"\n一連の処理を開始します... 元のサイズ: {img.size}")
    
    # ステップ1: 横幅を500pxにリサイズ (アスペクト比維持)
    width, height = img.size
    new_width = 500
    new_height = int(height * (new_width / width))
    resized_img = img.resize((new_width, new_height))
    print(f"ステップ1 (リサイズ後): {resized_img.size}")
    
    # ステップ2: 軽く5度回転
    rotated_img = resized_img.rotate(5, expand=True)
    print(f"ステップ2 (回転後): {rotated_img.size}")
    
    # ステップ3: 画像の中央部分を200x200で切り抜く
    w, h = rotated_img.size
    left = (w - 200) / 2
    top = (h - 200) / 2
    right = (w + 200) / 2
    bottom = (h + 200) / 2
    cropped_center_img = rotated_img.crop((left, top, right, bottom))
    print(f"ステップ3 (中央切り抜き後): {cropped_center_img.size}")
    
    # ステップ4: PNG形式で保存
    cropped_center_img.save(final_output_path)
    print(f"全ての処理が完了し、'{final_output_path}' に保存しました!")
    
    # 最終的な画像を表示
    # cropped_center_img.show()

このように、メソッドをチェーンのように繋げていくことで、複雑な画像処理も実現できます。


まとめ:Pillowで画像操作の第一歩はバッチリ!

今回は、Pillow入門シリーズの第1回として、画像処理の最も基本的で重要な操作について学びました。

  • 画像の読み込み (Image.open())表示 (show())保存 (save())
  • 画像の基本情報(フォーマット、サイズ、カラーモード)の取得
  • 画像のリサイズ (resize())
  • 画像の回転 (rotate())
  • 画像のトリミング(切り抜き, crop())

これらの基本操作だけでも、日常的な多くの画像処理タスクを自動化することができます。フォルダ内の画像をまとめてリサイズしたり、特定の部分を切り抜いてアイコンを作成したり、アイデア次第で様々な応用が可能です。

次回は、画像の「見た目」を本格的に加工していくテクニック、カラーモードの変換(グレースケール化など)や、様々なフィルター処理について解説していきます。お楽しみに!

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀