CodeGym /Adesua ahorow /Python SELF TW /GIF 和影像處理自動化

GIF 和影像處理自動化

Python SELF TW
等級 46 , 課堂 4
開放

1. 影像批次處理自動化

影像的批次處理可以幫助你對大量文件進行相同的操作,節省時間和精力。例如,當你有一個目錄內的圖片需要改變大小或加上浮水印時,可以用 Pillow 寫一個 script 來一次處理所有圖片。

批量調整資料夾內所有圖片的大小

以下範例將調整資料夾 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} 已成功調整並儲存。")

這個 script:

  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} 已加上浮水印。")

這個 script:

  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 格式。")

這個 script 會將 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 的值即可。


# 製作加速的動畫
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)

在這個例子中,duration=50,動畫的播放速度加快了一倍。

給現有的 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
Опрос
複雜的圖片操作,  46 уровень,  4 лекция
недоступен
複雜的圖片操作
複雜的圖片操作
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION