1. Tự động hóa xử lý nhiều hình ảnh
Xử lý hàng loạt hình ảnh cho phép thực hiện các tác vụ giống nhau trên nhiều file, giúp tiết kiệm thời gian và công sức. Ví dụ, nếu bạn có một thư mục ảnh cần thay đổi kích thước hoặc thêm watermark, Pillow cho phép tạo một script để áp dụng các thao tác cho tất cả ảnh.
Thay đổi kích thước tất cả hình ảnh trong thư mục
Trong ví dụ này, chúng ta sẽ thay đổi kích thước tất cả ảnh trong thư mục input_images và lưu kết quả vào thư mục output_images.
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# Đảm bảo rằng thư mục lưu trữ ảnh tồn tại
os.makedirs(output_folder, exist_ok=True)
# Lặp qua từng file trong thư mục input_folder
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Mở ảnh và thay đổi kích thước
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# Lưu ảnh
resized_img.save(output_path)
print(f"Ảnh {filename} đã được thay đổi kích thước và lưu thành công.")
Script này:
- Tải tất cả file từ thư mục
input_images. - Thay đổi kích thước mỗi ảnh thành 800x800 pixels.
- Lưu ảnh đã chỉnh sửa vào thư mục
output_images.
Thêm watermark vào hình ảnh
Việc thêm watermark vào tất cả các hình ảnh trong thư mục có thể dễ dàng tự động hóa. Trong ví dụ này, chúng ta thêm một watermark dạng text vào góc dưới cùng bên phải mỗi ảnh.
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"
# Đảm bảo rằng thư mục lưu trữ ảnh tồn tại
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)
# Mở ảnh và tạo đối tượng vẽ
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# Vị trí watermark
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# Thêm watermark
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"Watermark đã được thêm vào ảnh {filename}.")
Script này:
- Tải tất cả ảnh từ
input_images. - Thêm watermark dạng text vào góc dưới cùng bên phải của ảnh.
- Lưu kết quả vào
watermarked_images.
Chuyển đổi hình ảnh sang định dạng PNG
Việc chuyển đổi tất cả hình ảnh sang một định dạng cũng dễ dàng tự động hóa. Trong ví dụ này, chúng ta chuyển đổi tất cả ảnh trong thư mục sang định dạng PNG.
input_folder = "input_images/"
output_folder = "png_images/"
# Đảm bảo rằng thư mục lưu trữ ảnh tồn tại
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)
# Mở và chuyển đổi ảnh sang 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"Ảnh {filename} đã được chuyển đổi thành PNG thành công.")
Script này chuyển đổi hình ảnh từ các định dạng JPEG, BMP và TIFF sang PNG, lưu chúng trong thư mục png_images.
2. Làm việc với GIF-animations
GIF-animations là tập hợp các hình ảnh được hiển thị tuần tự, tạo hiệu ứng chuyển động. Với Pillow, bạn có thể tạo và chỉnh sửa GIF-animations, thêm và thay đổi frames, cũng như điều chỉnh tốc độ của animation.
Tạo một GIF-animation đơn giản
Để tạo GIF-animation, cần chuẩn bị một số hình ảnh (frames), sẽ được hiển thị liên tục. Trong ví dụ này, chúng ta tạo GIF từ hình ảnh trong thư mục frames.
# Danh sách hình ảnh cho animation
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)
# Lưu frames thành GIF-animation
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Code này:
- Tải ảnh từ thư mục
framesvà thêm vào danh sáchframes. - Tạo GIF-animation từ những frames này.
- Tham số
duration=100chỉ thời gian hiển thị mỗi frame (mili giây) vàloop=0tạo vòng lặp vô hạn.
Thay đổi tốc độ GIF-animation
Để thay đổi tốc độ animation, chỉ cần thay đổi giá trị tham số duration.
# Tạo animation với tốc độ tăng
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
Trong ví dụ này, duration=50, điều này làm tốc độ phát GIF tăng gấp 2 lần.
Thêm frame mới vào GIF hiện có
Bạn cũng có thể mở một GIF hiện có, thêm frame mới và lưu animation đã chỉnh sửa.
# Mở GIF hiện có
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# Thêm frame mới
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# Lưu animation đã chỉnh sửa
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Code này thêm frame mới new_frame.png vào cuối animation.
Trích xuất frames từ GIF-animation
Đôi khi cần chia nhỏ một GIF-animation thành các frames riêng lẻ. Pillow cho phép trích xuất và lưu từng frame.
from PIL import ImageSequence
# Mở GIF-animation và trích xuất frames
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
Code này lưu từng frame từ animation thành các ảnh PNG riêng lẻ.
Ví dụ làm việc đầy đủ với GIF-animation và xử lý hàng loạt
Cuối cùng, đây là ví dụ kết hợp tự động hóa xử lý hàng loạt và làm việc với GIF. Chúng ta tạo animation từ tất cả các hình ảnh trong thư mục, thay đổi kích thước mỗi frame trước khi thêm vào.
# Tải ảnh, thay đổi kích thước và tạo 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