CodeGym /Kurs Javy /Python SELF PL /GIF i Automatyzacja przetwarzania obrazów

GIF i Automatyzacja przetwarzania obrazów

Python SELF PL
Poziom 46 , Lekcja 4
Dostępny

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:

  1. Ładuje wszystkie pliki z folderu input_images.
  2. Zmieniamy rozmiar każdego obrazu do 800x800 pikseli.
  3. 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:

  1. Ładuje wszystkie obrazy z input_images.
  2. Dodaje tekstowy znak wodny w prawym dolnym rogu obrazu.
  3. 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:

  1. Ładuje obrazy z folderu frames i dodaje je do listy frames.
  2. Tworzy animację GIF z tych klatek.
  3. Parametr duration=100 określa czas wyświetlania każdej klatki w milisekundach, a loop=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)
1
Опрос
Złożone operacje na obrazach,  46 уровень,  4 лекция
недоступен
Złożone operacje na obrazach
Złożone operacje na obrazach
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION