1. 画像処理のバッチ自動化
バッチ処理では、大量のファイルに対して同じアクションを実行できるから、時間と手間が省けるよ。例えば、サイズを変更したりウォーターマークを追加したい画像フォルダがあったら、Pillowでスクリプトを1つ作ってその操作をすべての画像に適用できる。
フォルダ内の画像全てのサイズを変更
この例では、フォルダinput_images内の全ての画像のサイズを変更して、結果をフォルダoutput_imagesに保存する。
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# 保存用フォルダが存在することを確認
os.makedirs(output_folder, exist_ok=True)
# input_folder内の各ファイルを処理
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# 画像を開いてサイズを変更
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# 画像を保存
resized_img.save(output_path)
print(f"画像 {filename} を変更して保存完了。")
このスクリプトでは:
input_imagesフォルダ内のすべてのファイルを読み込む。- 各画像のサイズを800x800ピクセルに変更する。
- 変更済み画像を
output_imagesフォルダに保存する。
画像にウォーターマークを追加
フォルダ内のすべての画像にウォーターマークを簡単に自動追加可能だよ。この例では、画像の右下隅にテキストのウォーターマークを追加する。
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"
# 保存用フォルダが存在することを確認
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# 画像を開いて描画オブジェクトを作成
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# ウォーターマークの位置
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# ウォーターマークを追加
draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128))
output_path = os.path.join(output_folder, filename)
img.save(output_path)
print(f"画像 {filename} にウォーターマークを追加しました。")
このスクリプトでは:
input_imagesフォルダ内のすべての画像を読み込む。- 画像の右下隅にテキストウォーターマークを追加。
- 結果を
watermarked_imagesフォルダに保存。
画像をPNGフォーマットに変換
画像を一つのフォーマットに変換する作業も自動化できるよ。この例では、フォルダ内の全ての画像をPNGフォーマットに変換する。
input_folder = "input_images/"
output_folder = "png_images/"
# 保存用フォルダが存在することを確認
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".bmp", ".tiff")):
image_path = os.path.join(input_folder, filename)
# 画像を開いてPNGフォーマットに変換
with Image.open(image_path) as img:
base_filename = os.path.splitext(filename)[0]
output_path = os.path.join(output_folder, f"{base_filename}.png")
img.save(output_path, "PNG")
print(f"画像 {filename} をPNGに変換しました。")
このスクリプトではJPEG、BMP、TIFF形式の画像をPNG形式に変換してpng_imagesに保存する。
2. GIFアニメーションの操作
GIFアニメーションは、順番に表示される画像のシーケンスで、動きのエフェクトを作成するよ。Pillowを使ってGIFアニメーションを作成、編集したり、フレームを追加、変更したり、再生速度を調整できる。
シンプルなGIFアニメーションを作成
GIFアニメーションを作るには、いくつかの画像(フレーム)を用意する必要がある。この例ではframesフォルダ内の画像からGIFを作成する。
# アニメーション用の画像リスト
frames_folder = "frames/"
frames = []
for filename in sorted(os.listdir(frames_folder)):
if filename.endswith((".png", ".jpg")):
frame_path = os.path.join(frames_folder, filename)
frame = Image.open(frame_path)
frames.append(frame)
# 各フレームからGIFアニメーションを保存
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
このコードでは:
framesフォルダ内の画像を読み込んでframesリストに追加。- そのフレームからGIFアニメーションを作成。
duration=100は各フレームの表示時間をミリ秒単位で設定し、loop=0で無限ループを指定。
GIFアニメーションの速度変更
アニメーション速度を変更するには、durationの値を調整するだけでOK。
# 高速アニメーション作成
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
この例では、duration=50でGIF再生速度を2倍速に。
既存GIFに新しいフレームを追加
既存のGIFを開いて、新しいフレームを追加して更新されたアニメーションを保存することもできる。
# 既存のGIFを開く
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# 新しいフレームを追加
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# 更新されたアニメーションを保存
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
このコードでは、新しいフレームnew_frame.pngがアニメーションの最後に追加される。
GIFアニメーションのフレーム抽出
GIFアニメーションを個々のフレームに分割する必要がある場合もある。Pillowを使えば各フレームを個別に抽出して保存可能。
from PIL import ImageSequence
# GIFアニメーションを開いてフレームを抽出
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
このコードでは、アニメーションの各フレームがPNG画像として個別に保存される。
GIFアニメーションと画像処理のバッチ作業の完全な例
最後に、画像処理のバッチ作業とGIF操作を組み合わせた例を紹介する。ここでは、フォルダ内のすべての画像からサイズを変更したフレームを作り、アニメーションを作成する。
# 画像を読み込みサイズ変更してGIF作成
input_folder = "input_images/"
frames = []
new_size = (400, 400)
for filename in sorted(os.listdir(input_folder)):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
with Image.open(image_path) as img:
resized_frame = img.resize(new_size)
frames.append(resized_frame)
GO TO FULL VERSION