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:
- 從資料夾
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} 已加上浮水印。")
這個 script:
- 從資料夾
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 格式。")
這個 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)
這段程式碼:
- 載入資料夾
frames
的圖片並加入列表frames
。 - 從這些圖片製作 GIF 動畫。
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)
GO TO FULL VERSION