【完全版】PythonのPillowを徹底解説|サンプルコード多数

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年7月)

✔当記事は以下のような方に向けて書かれています

「PythonのPillowとは何か?」

「Pillowの使い方が知りたい」

「Pillowの実際の使用例を観覧したい」

✔当記事でお伝えしたい内容

  • PythonのPillowの基本知識
  • Pillowの使い方およびその応用法
  • Pillowの実例

当記事では、PillowというPythonのライブラリの基本概念から、その豊富な機能を活用した使用方法まで、リアルな例を引用しながら詳細に解説します。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

はじめに:PythonとPillowの紹介

こちらでは、「PythonとPillow」についてお伝えしていきます。

  • PythonとPillowの概要
  • Pillowの役立つ特性と他のライブラリとの比較

PythonとPillowの概要

Pillowは、Python言語で使用できる画像処理のためのライブラリです。

Pythonがシンプルで扱いやすい言語であるため、Pillowもまた初心者にとって手に取りやすいといえるでしょう。

PillowはPython Imaging Library (PIL)のフォークであり、PILが開発が停止された後に生まれました。

Pillowの役立つ特性と他のライブラリとの比較

Pillowは豊富な画像処理機能を持ちながら、簡潔なAPIを提供します。

OpenCVなど他のライブラリと比べて、インストールが簡単で、学習曲線が緩やかです。

しかし、高度な画像処理や解析を行う場合はOpenCVの方が適しているかもしれません。

早速体験:Pillowのインストール

こちらでは、Pillowのインストールについてお伝えします。

  • インストール前の注意事項
  • インストール手順
  • トラブルシューティング:インストールできない場合の対処法

インストール前の注意事項

Pythonがインストールされていることを確認してください。

また、PillowはPython 3.6以降で動作します。

バージョンが古い場合はアップデートしましょう。

インストール手順

Pillowのインストールはpipを使って簡単におこなえます。

pip install Pillow

pipのインストールやアップデートが必要な方はこちらも参考にしてください。

トラブルシューティング:インストールできない場合の対処法

エラーメッセージをよく読み、必要な依存関係が足りない場合はインストールします。

また、Pythonやpipのバージョンが原因の場合は、それらをアップデートしてください。

最初の一歩:Pillowの基本操作

こちらでは、Pillowを使った基本的な画像操作について解説します。

  • 画像の読み込み方法
  • 画像の表示方法
  • 画像の情報取得の手順
  • 画像の保存と出力手順

画像の読み込み方法

Pillowで画像を読み込むには、Imageモジュールのopen()関数を使用します。

これにより、画像ファイルをPython内で操作できるオブジェクトに変換できます。

image = Image.open('example.jpg')

画像の表示方法

読み込んだ画像を表示するには、show()メソッドを使用します。

このメソッドは、画像をデフォルトの画像ビューアで開きます。

image.show()

画像の情報取得の手順

画像オブジェクトから、サイズやフォーマットなどの情報を取得できます。

  • image.size:画像サイズを取得
  • image.format:フォーマットを取得

具体的なコード例はこちらです。

# 画像サイズを取得
width, height = image.size

# フォーマットを取得
image_format = img.format

画像の保存と出力手順

画像オブジェクトをファイルとして保存するには、save()メソッドを使用します。

引数には保存するファイル名を指定します。

image.save('new_image.jpg')

手を動かそう:Pillowで画像処理

こちらでは、Pillowを使用したさまざまな画像処理について学びます。

  • 画像のリサイズとクロップ
  • 画像の回転
  • 画像の2値化の工程
  • 輪郭抽出の方法
  • 画像のぼかし方

画像のリサイズとクロップ

画像のサイズを変更するにはresize()メソッドを、一部を切り取るにはcrop()メソッドを使用します。

  • resize()メソッド
  • crop()メソッド

resize()メソッド

以下はresize()メソッドを使った例です。

from PIL import Image

def resize_image(input_path, output_path, new_width, new_height):
    try:
        # 画像を開く
        with Image.open(input_path) as img:
            # 画像をリサイズ
            resized_img = img.resize((new_width, new_height))

            # リサイズされた画像を保存
            resized_img.save(output_path)

            print("画像のリサイズが完了しました。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# 元画像ファイルのパス
input_image_path = "path/to/your/input_image.jpg"

# リサイズ後の幅と高さ
new_width = 800
new_height = 600

# 出力画像ファイルのパス
output_image_path = "path/to/your/output_image.jpg"

# 画像をリサイズ
resize_image(input_image_path, output_image_path, new_width, new_height)

crop()メソッド

以下はcrop()使った例です。

from PIL import Image

def crop_image(input_path, output_path, left, top, right, bottom):
    try:
        # 画像を開く
        with Image.open(input_path) as img:
            # 一部を切り取る
            cropped_img = img.crop((left, top, right, bottom))

            # 切り取られた画像を保存
            cropped_img.save(output_path)

            print("画像の切り取りが完了しました。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# 元画像ファイルのパス
input_image_path = "path/to/your/input_image.jpg"

# 切り取る領域の座標 (left, top, right, bottom)
left = 100
top = 100
right = 500
bottom = 400

# 出力画像ファイルのパス
output_image_path = "path/to/your/output_image.jpg"

# 画像を切り取る
crop_image(input_image_path, output_image_path, left, top, right, bottom)

縦横比を保持したリサイズの実行例

以下はリサイズ時の縦横比を保持するためのコードです。

参考にしてください。

from PIL import Image

def resize_with_aspect_ratio(input_path, output_path, new_size):
    try:
        # 画像を開く
        with Image.open(input_path) as img:
            # 元画像のサイズを取得
            width, height = img.size

            # 新しいサイズのうち、縦横比に合わせた方の値を計算
            aspect_ratio = width / height
            new_width, new_height = (new_size, int(new_size / aspect_ratio)) if aspect_ratio >= 1 else (int(new_size * aspect_ratio), new_size)

            # 画像をリサイズ
            resized_img = img.resize((new_width, new_height))

            # リサイズされた画像を保存
            resized_img.save(output_path)

            print("画像のリサイズが完了しました。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# 元画像ファイルのパス
input_image_path = "path/to/your/input_image.jpg"

# リサイズ後のサイズ(長辺の長さを指定)
new_size = 800

# 出力画像ファイルのパス
output_image_path = "path/to/your/output_image.jpg"

# 画像を縦横比を保持しつつリサイズ
resize_with_aspect_ratio(input_image_path, output_image_path, new_size)

画像の回転

rotate()メソッドを使用して画像を回転させられます。

引数には回転する角度を指定してください。

#角度
angle = 45
# 画像を回転
rotated_img = img.rotate(angle)

画像の2値化の工程

2値化は画像を白と黒の2色のみで表現する処理です。

convert()メソッドを使って実行します。

image.convert('1')

輪郭抽出の方法

輪郭抽出は画像から物体の境界線を検出する処理です。

filter()メソッドとImageFilter.FIND_EDGESを組み合わせて使用します。

image.filter(ImageFilter.FIND_EDGES)

画像のぼかし方

Pillowで画像をぼかすには、filter()メソッドを使用します。

  • BLURによるぼかし
  • ガウスぼかしの使用例
  • BoxBlurの実践例

BLURによるぼかし

ImageFilter.BLURを使用して、画像を軽くぼかします。

image.filter(ImageFilter.BLUR)

ガウスぼかしの使用例

ガウスぼかしはImageFilter.GaussianBlur()を使用します。

引数でぼかしの強さを調整できます。

# ぼかしの強さ(大きい値ほど強いぼかし)
blur_strength = 5

# ガウスぼかしを適用
blurred_img = img.filter(ImageFilter.GaussianBlur(blur_strength))

BoxBlurの実践例

BoxBlurはImageFilter.BoxBlur()を使用し、引数でぼかしの強さを調整します。

# ぼかしの強さ(大きい値ほど強いぼかし)
blur_strength = 5

# BoxBlurを適用
blurred_img = img.filter(ImageFilter.BoxBlur(blur_strength))

活用してみよう:応用的な画像処理

こちらでは、Pillowでできる応用的な画像処理を学びます。

  • ペースト機能:画像に別の画像を貼り付け
  • 画像合成:2枚の画像を一つに
  • 画像連結:複数の画像を一つに繋げる
  • 透過PNG画像の作成方法
  • ネガポジ反転:画素値を逆転させる方法
  • サムネイル作成:円形や正方形のサムネイル画像作り方
  • アニメーションGIFの作り方

ペースト機能:画像に別の画像を貼り付け

paste()メソッドを使用して、ある画像に別の画像を重ねられます。

image.paste(another_image, (x, y))

画像合成:2枚の画像を一つに

Image.blend()関数を使用して、2枚の画像をブレンドして一つの画像に合成します。

# 1枚目の画像ファイルのパス
image1_path = "path/to/your/image1.jpg"

# 2枚目の画像ファイルのパス
image2_path = "path/to/your/image2.jpg"

# ブレンドの透明度(0から1の間の値、0に近いほど1枚目の画像が透明になる)
alpha = 0.5

# 2枚の画像をブレンドして合成
blended_img = Image.blend(img1, img2, alpha)

画像連結:複数の画像を一つに繋げる

複数の画像を連結するには、Image.new()で新しい画像を作成し、paste()メソッドで各画像を配置します。

image_paths = ["path/to/your/image1.jpg", "path/to/your/image2.jpg", "path/to/your/image3.jpg"]

# 画像を連結するための空のキャンバスを作成
images = [Image.open(image_path) for image_path in image_paths]
max_width = max(img.width for img in images)
total_height = sum(img.height for img in images)

concatenated_image = Image.new("RGB", (max_width, total_height))

透過PNG画像の作成方法

透過PNGは、convert()メソッドとputalpha()メソッドを使用すれば作成可能です。

convert()でRGBAモードに変換した後、putalpha()で透明度を指定します。

# 透明度(0から255の範囲、0に近いほど透明)
alpha_value = 100

# 画像をRGBAモードに変換
rgba_img = img.convert("RGBA")

# 透明度を指定
alpha_img = Image.new("RGBA", rgba_img.size, (255, 255, 255, alpha_value))
transparent_img = Image.alpha_composite(rgba_img, alpha_img)

ネガポジ反転:画素値を逆転させる方法

ネガポジ反転は、画像の各ピクセルの色を反対にする処理です。

ImageOpsモジュールのinvert()関数を使用します。

ImageOps.invert(image)

サムネイル作成:円形や正方形のサムネイル画像作り方

サムネイルは、thumbnail()メソッドを使って作成します。

サイズを指定して、画像の縦横比を保持しながらリサイズが可能です。

円形のサムネイルを作るには、マスクを使用します。

from PIL import Image, ImageDraw, ImageOps

def create_thumbnail(input_image_path, output_thumbnail_path, size):
    try:
        # 画像を開く
        with Image.open(input_image_path) as img:
            # サムネイルを作成
            img.thumbnail(size)

            # サムネイルを保存
            img.save(output_thumbnail_path)

            print("サムネイルが作成されました。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

def create_circular_thumbnail(input_image_path, output_circular_thumbnail_path, size):
    try:
        # 画像を開く
        with Image.open(input_image_path) as img:
            # サムネイルを作成
            img.thumbnail(size)

            # 画像を円形に切り抜くマスクを作成
            mask = Image.new("L", size, 0)
            draw = ImageDraw.Draw(mask)
            draw.ellipse((0, 0, size[0], size[1]), fill=255)

            # 画像を円形に切り抜く
            circular_thumbnail = ImageOps.fit(img, mask.size, centering=(0.5, 0.5))
            circular_thumbnail.putalpha(mask)

            # 円形のサムネイルを保存
            circular_thumbnail.save(output_circular_thumbnail_path)

            print("円形のサムネイルが作成されました。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# 元画像ファイルのパス
input_image_path = "path/to/your/input_image.jpg"

# サムネイルのサイズ
thumbnail_size = (150, 150)

# サムネイルを保存するパス
output_thumbnail_path = "path/to/your/output_thumbnail.jpg"

# 円形のサムネイルを保存するパス
output_circular_thumbnail_path = "path/to/your/output_circular_thumbnail.png"

# サムネイルを作成
create_thumbnail(input_image_path, output_thumbnail_path, thumbnail_size)

# 円形のサムネイルを作成
create_circular_thumbnail(input_image_path, output_circular_thumbnail_path, thumbnail_size)

アニメーションGIFの作り方

PillowでアニメーションGIFを作成するには、save()メソッドで、save_allパラメータをTrueに設定します。

各フレーム画像をリストで渡し、append_imagesパラメータで指定しましょう。

from PIL import Image

def create_animation_gif(frame_images, output_gif_path, duration=200, loop=0):
    try:
        # フレーム画像を連結してアニメーションGIFを作成
        frame_images[0].save(
            output_gif_path,
            save_all=True,
            append_images=frame_images[1:],
            duration=duration,
            loop=loop
        )

        print("アニメーションGIFが作成されました。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# フレーム画像ファイルのパス(複数のフレーム画像を指定してください)
frame_image_paths = [
    "path/to/your/frame_image1.png",
    "path/to/your/frame_image2.png",
    "path/to/your/frame_image3.png",
    # 追加のフレーム画像をここに追加してください
]

# フレーム画像を開く
frame_images = [Image.open(image_path) for image_path in frame_image_paths]

# 出力GIFファイルのパス
output_gif_path = "path/to/your/output_animation.gif"

# アニメーションGIFを作成
create_animation_gif(frame_images, output_gif_path)

エラー対処:よくあるトラブルと解決策

こちらでは、Pillowを使用している際に遭遇する可能性のある一般的なトラブルと、それらを解決するための方法を学びます。

  • インストールエラー
  • 画像の読み込みエラー
  • 画像の操作エラー

インストールエラー

Pillowのインストール時にエラーが生じる場合、原因として考えられるのはPythonのバージョンや依存ライブラリの不足などがあります。

  • 解決策1: Pythonのバージョンが最新であることを確認してください。バージョンが古い場合、アップデートを行います。
  • 解決策2: 必要な依存ライブラリがすべてインストールされているか確認します。特にlibjpegやlibpngなど、画像フォーマットのライブラリが不足しているとエラーが起きることがあります。

画像の読み込みエラー

Pillowを使用して画像を開く際にエラーが生じることがあります。

その原因としては、画像ファイルのフォーマットエラーや、ファイルが存在しないなどが考えられます。

  • 解決策1: 画像ファイルが存在し、正しいパスが指定されていることを確認してください。
  • 解決策2: 画像ファイルのフォーマットがPillowでサポートされているものであることを確認してください。Pillowが対応していない特殊なフォーマットの場合、他のライブラリを検討するか、画像を変換する必要があります。

画像の操作エラー

画像のリサイズやクロップなど、画像に対する操作を行う際にエラーが発生することがあります。

これらのエラーは主に、操作のパラメータが画像のサイズや形状と一致しないことにより生じます。

  • 解決策1: パラメータが画像の範囲内であることを確認してください。例えば、クロップの際に指定する範囲が画像のサイズを超えているとエラーが生じます。
  • 解決策2: 画像がカラーモードに適していることを確認してください。一部の操作は特定のカラーモードでしか適用できないため、必要に応じて画像のカラーモードを変

まとめ

当記事では、PythonのPillowについて学習してきました。

これであなたは画像を読み込んで表示し、編集して保存する基本的なスキルを持っています。

しかし、これは始まりに過ぎません。

次の一歩として、さらに高度な画像処理技術を学ぶために、OpenCVなどの他のライブラリを探ることをおすすめします。

Pillowは非常に強力で、シンプルなAPIを備えた画像処理ライブラリです。

これを活用し、自分のプロジェクトやアイデアに取り組むための基盤として利用してください。

タイトルとURLをコピーしました