Pythonで一気に画像編集できるPillowを使った画像処理のチートシート

Python

たくさんの画像を一気にパパッと処理したい

そんな時はPythonプログラムを使って、画像処理を自動化してしまうと便利です。

画像処理ライブラリPillowでは、以下のような処理ができます。

  • 画像フォーマットの変換
  • 画像サイズの拡大・縮小
  • 画像の切り抜き
  • 画像の回転・反転
  • 画像の色の調整
  • 画像に文字を挿入

Pillowを使うために必要な準備

まず画像処理ライブラリのPillowを使うために必要な準備をしていきます。

Pillowをインストール

pip install pillow
Pillowは外部ライブラリなので、インストールが必要です。
プログラムを実行する前に、上のように記述してインストールを済ませます。

Pillowをインポート

from PIL import Image
インストールと同様に、プログラム冒頭でインポートしておきます。
インポートする際は、PillowではなくPILという名前なので注意です。

はじめに画像を読み込む

img = Image.open('画像のファイルパス')
Image.open()では、画像ファイルを読み込んでImageオブジェクトを返します。
そして返り値のImageオブジェクトを変数imgとして、以降の解説を進めていきます。

今回は画像ファイル『test.png』を例にして、いろいろな処理をしてみます。

画像についての情報をチェック

Imageオブジェクトでは、属性を使って画像ファイルの情報をチェックできます。

ファイル名 img.filename
サイズ(幅・高さ) img.size
img.width
高さ img.height
カラーモード img.mode
フォーマット形式 img.format

プログラム例:

from PIL import Image

img = Image.open('test.png')
print(f'ファイル名: {img.filename}') #画像のファイル名を表示
print(f'画像サイズ: {img.size}') #画像の縦横サイズを表示
print(f'画像の幅: {img.width}') #画像の横幅サイズを表示
print(f'画像の高さ: {img.height}') #画像の縦幅サイズを表示
print(f'カラーモード: {img.mode}') #画像のカラーモードを表示
print(f'フォーマット形式: {img.format}') #画像のフォーマット形式を表示

このプログラムを実行すると、出力結果は以下のようになります。

ファイル名: test.png
画像サイズ: (600, 600)
画像の幅: 600
画像の高さ: 600
カラーモード: RGB
フォーマット形式: PNG

画像ファイルに関する情報を、Imageオブジェクトから表示することができました。

読み込んだ画像を操作する方法

サイズ変更・切り抜きなど、画像操作はImageオブジェクトのメソッドで行います。
Imageオブジェクトにメソッドで命令を与えることで、指定した画像処理が実行されます。

img.show()
img.show()では、OSのアプリケーションで画像を表示します。
OSで画像ファイルを開いた時のデフォルトのアプリケーションで、画像を表示してくれます。

画像を保存する

img.save('保存後のファイルパス')
img.save()で、画像ファイルを保存します。
保存後の画像フォーマットは、引数に指定したファイルパスの拡張子になります。

Pillowの基本的な流れは画像処理→保存なので、1番使うメソッドです。

引数を使って、保存する画像のパラメータを設定することも可能です。

  • 保存する画質
  • img.save('test.jpg', quality=95)
    1〜100で設定可能で、数値が高いほど保存した画像ファイルの劣化が少ないです。
    デフォルトで何も指定しない場合、75で保存されます。

  • 保存する画像フォーマット
  • img.save('test.jpg', format='jpeg')
    元の画像ファイルがPNGだった場合でも、JPEGに変換して保存できます。

画像サイズを変更する

img.resize((幅,高さ))
img.resize()で、画像のサイズを拡大・縮小することができます。
リサイズしたいサイズは、(幅,高さ)というタプル型で引数に指定します。

プログラム例:

from PIL import Image

img = Image.open('test.png') #画像の読み込み
img2 = img.resize((300,300)) #画像のリサイズ
img2.save('test_half.png') #リサイズした画像を保存

600×600サイズのtest.pngを、300×300サイズに縮小することができました。

画像を切り抜く

img.crop(box=(左上x,左上y,右下x,右下y))
img.crop()で、指定した座標で画像を切り抜きます。
切り取りたいサイズは、四角形の(左端,上端,右端,下端)という形式で、座標を引数に指定します。

プログラム例:

from PIL import Image

img = Image.open('test.png') #画像の読み込み
img2 = img.crop(box=(100,100,400,400)) #画像の切り抜き
img2.save('test_crop.png') #切り抜いた画像を保存

img.crop(box=(100,100,400,400))だと、下の画像のような切り抜き方になります。


600×600サイズのtest.pngを、300×300サイズだけ切り抜くことができました。

画像を中心から切り抜く

画像ファイルを中心から切り抜きたい時はどのようにすれば良いでしょうか?
img.sizeで画像のサイズを取得すれば、いちいち座標を調べずに均等に切り抜くことができます。

プログラム例:

from PIL import Image, ImageFilter

file = 'test.png' #切り抜きたい画像ファイル
crop_width = 300 #切り抜きたい横幅サイズ
crop_height = 300 #切り抜きたい縦幅サイズ

def crop_center(file, crop_width, crop_height):
    img = Image.open(file) #画像を読み込む
    img_width, img_height = img.size #画像の横幅・縦幅サイズを取得
    img2 = img.crop(((img_width - crop_width) / 2,
                         (img_height - crop_height) / 2,
                         (img_width + crop_width) / 2,
                         (img_height + crop_height) / 2)) #画像を切り抜く
    file_name, ext = os.path.splitext(file) #画像のファイル名を取得
    filename = file_name + '_center' + '.png' #新しい画像ファイル名を作成
    img2.save(filename) #切り抜いた画像を新しいファイル名で保存

if __name__ == "__main__":
    crop_center(file, crop_width, crop_height)

以下の図のように、座標を自動で取得して、中心から均等に切り抜いています。

600×600サイズのtest.pngを、中心から300×300サイズで切り抜くことができました。

画像を回転する

img.rotate(回転したい度数)
img.rotate()で、指定した角度で画像を回転します。
引数には、回転したい角度を反時計回りで指定します。

プログラム例:

from PIL import Image

img = Image.open('test.png') #画像の読み込み
img2 = img.rotate(-90) #画像の回転
img2.save('test_rotate.png') #回転した画像を保存

test.pngを、時計回りに90度回転することができました。
デフォルトは反時計回りですが、-(マイナス)をつけることで時計回りにもできます。

画像を反転する

画像を反転して、鏡に映したように画像の上下左右を逆にすることもできます。
from PIL import Image, ImageOps
反転処理の場合はPillowに加えて、ImageOpsモジュールのインポートが必要になります。

  • 上下に反転
  • ImageOps.flip(img)
    ImageOps.flip()で、画像を上下方向に反転します。

    プログラム例:

    from PIL import Image, ImageOps
    
    img = Image.open('test.png') #画像の読み込み
    img2 = ImageOps.flip(img) #画像の上下反転
    img2.save('test_flip.png') #上下反転した画像を保存

    test.pngを、上下方向に反転することができました。

  • 左右に反転
  • ImageOps.mirror(img)
    ImageOps.mirror()で、画像を左右方向に反転します。

    プログラム例:

    from PIL import Image, ImageOps
    
    img = Image.open('test.png') #画像の読み込み
    img2 = ImageOps.mirror(img) #画像の左右反転
    img2.save('test_mirror.png') #左右反転した画像を保存

    test.pngを、左右方向に反転することができました。

画像の色情報を変換する

img.convert('変換したいカラーモード')
img.convert()で、画像のカラーモードを変換します。

引数には、以下のようなカラーモードを指定することができます。

1 1bit
L 8bit(グレイスケール)
LA アルファチャンネル(L値を乗算)
P パレットモード
RGB 8bit x 3
RGBA 8bit x 4(透明度付き)
RGBa アルファチャンネル(RGB値を乗算)
CMYK 8bit x 4
YCbCr 8bit x 3
HSV 8bit x 3(pillowのみ)
I 32bit(整数)
F 32bit(浮動少数)

画像に文字を挿入する

draw.text((x座標, y座標), '文字列', font=フォント, fill=文字色)
draw.text()では、画像に文字を挿入することができます。

以下の4ステップで、画像に文字を挿入していきます。

  1. ImageDraw・ImageFontのインポート
  2. from PIL import Image, ImageDraw, ImageFont
    ImageDrawとImageFontをインポートします。

  3. ImageDrawインスタンスを生成
  4. draw = ImageDraw.Draw(img)
    文字の挿入を行う場所として、ImageDrawインスタンスを作ります。

  5. フォントの種類・大きさを設定
  6. font = ImageFont.truetype("フォントのファイルパス", 文字の大きさ)
    ImageFont.truetype()で、引数に指定したフォントオブジェクトを作成します。

  7. 画像に文字列を挿入する
  8. draw.text((x座標, y座標), '文字列', font=フォント, fill=文字色)
    ImageDrawインスタンス上に、文字列を挿入します。
    引数には、文字を挿入する座標、文字の内容、文字のフォント、文字の色を指定できます。

プログラムを使って実装する場合、以下の例のように使います。

プログラム例:

from PIL import Image, ImageDraw, ImageFont

img = Image.open('test.png') #画像の読み込み
draw = ImageDraw.Draw(img) #ImageDrawインスタンスの作成
font = ImageFont.truetype("/Users/apple/Downloads/migmix-1p-bold.ttf", 50) #フォントの作成
draw.text((0, 300), 'Pillowで挿入した文字列', font=font, fill='#e4007f') #文字列の挿入
img.save('test_font.png') #文字を挿入した画像を保存

実行すると以下のように、test.pngに文字列を挿入することができました。

こちらのプログラムでも、draw.text()を使って文字を挿入しています。

Pythonで画像にテキストを入れて複数のアイキャッチを一括で作るプログラム
今回のPythonのプログラムは複数の画像にテキストを一気に入れて、アイキャッチ画像を作るプログラムです。実は、このブログのアイキャッチも全部プログラムで一気に作っています。まにゃpy例えばこんな感じでできるよ↓このプログラムを使えば、画像

コメント

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