たくさんの画像を一気にパパッと処理したい
そんな時はPythonプログラムを使って、画像処理を自動化してしまうと便利です。
画像処理ライブラリPillowでは、以下のような処理ができます。
- 画像フォーマットの変換
- 画像サイズの拡大・縮小
- 画像の切り抜き
- 画像の回転・反転
- 画像の色の調整
- 画像に文字を挿入
Pillowを使うために必要な準備
まず画像処理ライブラリのPillowを使うために必要な準備をしていきます。
Pillowをインストール
pip install pillow
Pillowは外部ライブラリなので、インストールが必要です。
プログラムを実行する前に、上のように記述してインストールを済ませます。
Pillowをインポート
from PIL import Image
インストールと同様に、プログラム冒頭でインポートしておきます。
インポートする際は、PillowではなくPILという名前なので注意です。
はじめに画像を読み込む
img = Image.open('画像のファイルパス')
Image.open()では、画像ファイルを読み込んでImageオブジェクトを返します。
そして返り値のImageオブジェクトを変数imgとして、以降の解説を進めていきます。
画像についての情報をチェック
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}') #画像のフォーマット形式を表示
このプログラムを実行すると、出力結果は以下のようになります。
画像サイズ: (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()では、画像に文字を挿入することができます。
- ImageDraw・ImageFontのインポート
- ImageDrawインスタンスを生成
- フォントの種類・大きさを設定
- 画像に文字列を挿入する
from PIL import Image, ImageDraw, ImageFont
ImageDrawとImageFontをインポートします。
draw = ImageDraw.Draw(img)
文字の挿入を行う場所として、ImageDrawインスタンスを作ります。
font = ImageFont.truetype("フォントのファイルパス", 文字の大きさ)
ImageFont.truetype()で、引数に指定したフォントオブジェクトを作成します。
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()を使って文字を挿入しています。
コメント