この記事は、Pythonの画像処理ライブラリPillow
の解説シリーズの第2回です。今回は、画像の切り抜き(クロップ)、コピー&ペースト、リサイズ、回転、反転といった、画像の形状を操作する基本的な変形処理について解説します。
1. 画像の切り抜き(クロップ)
.crop()
メソッドを使うと、画像内の矩形領域を切り抜いて、新しいImage
オブジェクトとして取得できます。
領域は、(左, 上, 右, 下)
の4つの座標をタプルで指定します。座標の原点(0, 0)
は画像の左上隅です。
from PIL import Image
try:
img = Image.open('sample.png')
# (x1, y1)から(x2, y2)までの領域を定義
# (左, 上, 右, 下)
box = (100, 100, 400, 400)
cropped_img = img.crop(box)
cropped_img.save('cropped_sample.png')
print("画像を切り抜いて保存しました。")
except FileNotFoundError:
print("エラー: sample.pngが見つかりません。")
2. 画像のコピー&ペースト
.copy()
メソッドで画像の複製を作成し、.paste()
メソッドでその複製の上に別の画像を貼り付けることができます。
from PIL import Image
try:
img = Image.open('sample.png')
# 貼り付けるパーツを切り抜く
part_to_paste = img.crop((50, 50, 150, 150))
# 元画像のコピーを作成
img_copy = img.copy()
# コピーした画像にパーツを貼り付け
# paste(貼り付ける画像, (左上のx座標, 左上のy座標))
img_copy.paste(part_to_paste, (0, 0))
img_copy.paste(part_to_paste, (200, 300))
img_copy.save('pasted_sample.png')
print("画像をコピー&ペーストして保存しました。")
except FileNotFoundError:
print("エラー: sample.pngが見つかりません。")
3. 画像のリサイズとサムネイル作成
画像のサイズを変更するには、主にresize()
とthumbnail()
の2つのメソッドがあります。
resize((幅, 高さ))
このメソッドは、指定した幅と高さに画像をリサイズした、新しいImage
オブジェクトを返します。アスペクト比は維持されず、画像は指定されたサイズに引き伸ばされます。
thumbnail((幅, 高さ))
このメソッドは、アスペ-クト比を維持したまま、指定した幅と高さの範囲内に収まるように画像を縮小します。resize()
とは異なり、このメソッドは元のImage
オブジェクトを直接変更します。
from PIL import Image
try:
img = Image.open('sample.png')
width, height = img.size
# 幅と高さを半分にリサイズ
resized_img = img.resize((width // 2, height // 2))
resized_img.save('resized_sample.png')
# 128x128のサムネイルを作成
# 元のオブジェクトが変更されるため、コピーに対して操作を行う
thumbnail_img = img.copy()
thumbnail_img.thumbnail((128, 128))
thumbnail_img.save('thumbnail_sample.jpg')
print("リサイズ版とサムネイル版を保存しました。")
except FileNotFoundError:
print("エラー: sample.pngが見つかりません。")
4. 画像の回転と反転
.rotate()
メソッドで画像を回転させ、.transpose()
メソッドで画像を反転させることができます。
from PIL import Image, ImageOps
try:
img = Image.open('sample.png')
# 画像を90度回転
img.rotate(90).save('rotated_90.png')
# expand=Trueは、回転後の画像全体が収まるようにキャンバスサイズを拡張する
img.rotate(45, expand=True).save('rotated_45_expanded.png')
# 左右反転
# 古い `Image.FLIP_LEFT_RIGHT` は `Image.Transpose.FLIP_LEFT_RIGHT` になりました
img.transpose(Image.Transpose.FLIP_LEFT_RIGHT).save('flipped_horizontal.png')
# 上下反転
img.transpose(Image.Transpose.FLIP_TOP_BOTTOM).save('flipped_vertical.png')
print("回転・反転した画像を保存しました。")
except FileNotFoundError:
print("エラー: sample.pngが見つかりません。")
まとめ
今回は、Pillowを使った画像の基本的な変形操作について解説しました。.crop()
で画像を切り抜き、.paste()
で貼り付け、.resize()
や.thumbnail()
でサイズを変更し、.rotate()
や.transpose()
で向きを変えることができます。
次回は、より高度な操作として、ピクセル単位で画像を直接編集する方法について解説します。