CodeGym /Các khóa học /Python SELF VI /GIF và Tự động hóa xử lý hình ảnh

GIF và Tự động hóa xử lý hình ảnh

Python SELF VI
Mức độ , Bài học
Có sẵn

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:

  1. Tải tất cả file từ thư mục input_images.
  2. Thay đổi kích thước mỗi ảnh thành 800x800 pixels.
  3. 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:

  1. Tải tất cả ảnh từ input_images.
  2. Thêm watermark dạng text vào góc dưới cùng bên phải của ảnh.
  3. 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:

  1. Tải ảnh từ thư mục frames và thêm vào danh sách frames.
  2. Tạo GIF-animation từ những frames này.
  3. Tham số duration=100 chỉ thời gian hiển thị mỗi frame (mili giây) và loop=0 tạ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)
1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Các thao tác phức tạp với hình ảnh
Các thao tác phức tạp với hình ảnh
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION