1. Automatyzacja przetwarzania paczek obrazów
Przetwarzanie paczek obrazów pozwala wykonać te same operacje na dużej liczbie plików, co oszczędza czas i wysiłek. Na przykład, jeśli masz katalog obrazów, które trzeba zmniejszyć albo dodać znak wodny, Pillow pozwala stworzyć jeden skrypt, który zastosuje operacje na wszystkich obrazach.
Zmiana rozmiaru wszystkich obrazów w folderze
W tym przykładzie zmienimy rozmiar wszystkich obrazów w folderze input_images
i zapiszemy wyniki w folderze output_images
.
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# Upewniamy się, że folder do zapisywania obrazów istnieje
os.makedirs(output_folder, exist_ok=True)
# Przechodzimy przez każdy plik w folderze input_folder
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Otwieramy obraz i zmieniamy jego rozmiar
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# Zapisujemy obraz
resized_img.save(output_path)
print(f"Obraz {filename} został pomyślnie zmieniony i zapisany.")
Ten skrypt:
- Ładuje wszystkie pliki z folderu
input_images
. - Zmieniamy rozmiar każdego obrazu do 800x800 pikseli.
- Zapisuje zmienione obrazy w folderze
output_images
.
Dodawanie znaku wodnego do obrazów
Dodawanie znaku wodnego do wszystkich obrazów w folderze można łatwo zautomatyzować. W tym przykładzie dodajemy tekstowy znak wodny w prawym dolnym rogu każdego obrazu.
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"
# Upewniamy się, że folder do zapisywania obrazów istnieje
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)
# Otwieramy obraz i tworzymy obiekt do rysowania
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# Pozycja dla znaku wodnego
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# Dodajemy znak wodny
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"Znak wodny został dodany do obrazu {filename}.")
Ten skrypt:
- Ładuje wszystkie obrazy z
input_images
. - Dodaje tekstowy znak wodny w prawym dolnym rogu obrazu.
- Zapisuje wynik w
watermarked_images
.
Konwersja obrazów do formatu PNG
Konwersja wszystkich obrazów do jednego formatu również jest łatwa do automatyzacji. W tym przykładzie konwertujemy wszystkie obrazy z folderu na format PNG.
input_folder = "input_images/"
output_folder = "png_images/"
# Upewniamy się, że folder do zapisywania obrazów istnieje
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)
# Otwieramy i konwertujemy obraz do 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"Obraz {filename} został pomyślnie przekonwertowany do PNG.")
Ten skrypt konwertuje obrazy z formatów JPEG, BMP i TIFF do PNG, zapisując je w folderze png_images
.
2. Praca z animacjami GIF
Animacje GIF to sekwencje obrazów, które są pokazywane jedno po drugim, tworząc efekt ruchu. Za pomocą Pillow można tworzyć i edytować animacje GIF, dodawać i zmieniać klatki, a także zarządzać prędkością animacji.
Tworzenie prostej animacji GIF
Aby stworzyć animację GIF, należy przygotować kilka obrazów (klatek), które zostaną pokazane sekwencyjnie. W tym przykładzie tworzymy GIF z obrazów znajdujących się w folderze frames
.
# Lista obrazów do animacji
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)
# Zapisywanie klatek w animacji GIF
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Ten kod:
- Ładuje obrazy z folderu
frames
i dodaje je do listyframes
. - Tworzy animację GIF z tych klatek.
- Parametr
duration=100
określa czas wyświetlania każdej klatki w milisekundach, aloop=0
ustawia nieskończoną pętlę odtwarzania.
Zmiana prędkości animacji GIF
Aby zmienić prędkość animacji, wystarczy zmienić wartość parametru duration
.
# Tworzenie animacji z zwiększoną prędkością
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
W tym przykładzie duration=50
, co przyspiesza odtwarzanie GIF o dwukrotnie.
Dodawanie nowych klatek do istniejącego GIF
Możesz również otworzyć istniejący GIF, dodać do niego nowe klatki i zapisać zaktualizowaną animację.
# Otwarcie istniejącego GIF
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# Dodanie nowej klatki
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# Zapisywanie zaktualizowanej animacji
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Ten kod dodaje nową klatkę new_frame.png
na koniec animacji.
Wyciąganie klatek z animacji GIF
Czasami potrzebujesz podzielić animację GIF na poszczególne klatki. Pillow pozwala wyciągać i zapisywać każdy klatkę osobno.
from PIL import ImageSequence
# Otwarcie animacji GIF i wyciąganie klatek
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
Ten kod zapisuje każdą klatkę z animacji jako osobny obraz PNG.
Przykład pełnej pracy z animacją GIF i przetwarzaniem paczek
Na koniec pokażemy przykład, w którym łączymy automatyzację przetwarzania paczek i pracę z GIF. Tworzymy animację ze wszystkich obrazów w folderze, zmieniając rozmiar każdej klatki przed dodaniem.
# Ładowanie obrazów, zmiana ich rozmiaru i tworzenie 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