CodeGym /コース /Python SELF JA /GIFと画像処理の自動化

GIFと画像処理の自動化

Python SELF JA
レベル 46 , レッスン 4
使用可能

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} を変更して保存完了。")

このスクリプトでは:

  1. input_imagesフォルダ内のすべてのファイルを読み込む。
  2. 各画像のサイズを800x800ピクセルに変更する。
  3. 変更済み画像を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} にウォーターマークを追加しました。")

このスクリプトでは:

  1. input_imagesフォルダ内のすべての画像を読み込む。
  2. 画像の右下隅にテキストウォーターマークを追加。
  3. 結果を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)

このコードでは:

  1. framesフォルダ内の画像を読み込んでframesリストに追加。
  2. そのフレームからGIFアニメーションを作成。
  3. 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)
1
タスク
Python SELF JA, レベル 46, レッスン 4
ロック未解除
画像のサイズ変更
画像のサイズ変更
2
タスク
Python SELF JA, レベル 46, レッスン 4
ロック未解除
透かしの追加
透かしの追加
3
タスク
Python SELF JA, レベル 46, レッスン 4
ロック未解除
画像をGIFに変換する
画像をGIFに変換する
4
タスク
Python SELF JA, レベル 46, レッスン 4
ロック未解除
GIFアニメーションの自動作成およびサイズ変更
GIFアニメーションの自動作成およびサイズ変更
1
アンケート/クイズ
画像に関する複雑な操作、レベル 46、レッスン 4
使用不可
画像に関する複雑な操作
画像に関する複雑な操作
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION