Как изменить размер изображения с помощью Python и PIL?

PIL (Python Imaging Library) — это мощная библиотека для обработки изображений на Python, позволяющая манипулировать изображениями различными способами. Изменение размера изображений — одна из основных задач в цифровой обработке изображений, используемая для оптимизации загрузки страниц, подготовки контента для социальных сетей, создания миниатюр и т. д.

Установка библиотеки Pillow

Pillow — это поддерживаемая и улучшенная версия PIL. Установить её можно с помощью pip, стандартного менеджера пакетов Python.

pip install Pillow

Импорт необходимых модулей

После установки Pillow, необходимо импортировать необходимые классы и функции для работы с изображениями.

from PIL import Image

Открытие изображения

Для работы с изображением его необходимо сначала открыть. Рассмотрим, как это сделать, а также обработку возможных ошибок.

def open_image(file_path: str) -> Image.Image:
    """
    Открывает изображение по указанному пути.

    :param file_path: Путь к изображению.
    :return: Объект изображения.
    """
    try:
        image = Image.open(file_path)
        return image
    except FileNotFoundError:
        print(f"Файл {file_path} не найден.")
    except IOError:
        print("Ошибка при открытии изображения.")

Изменение размера изображения

Использование метода resize

Метод resize позволяет изменять размер изображения. Давайте рассмотрим, как это сделать.

def resize_image(image: Image.Image, new_size: tuple[int, int]) -> Image.Image:
    """
    Изменяет размер изображения.

    :param image: Объект изображения.
    :param new_size: Новый размер изображения (ширина, высота).
    :return: Измененное изображение.
    """
    return image.resize(new_size, Image.ANTIALIAS)

Сохранение измененного изображения

После изменения размера, изменённое изображение необходимо сохранить на диск.

def save_image(image: Image.Image, save_path: str, format: str = 'JPEG') -> None:
    """
    Сохраняет изображение по указанному пути.

    :param image: Объект изображения.
    :param save_path: Путь для сохранения изображения.
    :param format: Формат сохранения (по умолчанию 'JPEG').
    """
    image.save(save_path, format=format)

Сохранение различных форматов изображений

Pillow поддерживает множество форматов изображений, таких как JPEG, PNG, GIF и т.д. Рассмотрим, как сохранять изображения в различных форматах.

image.save("output_image.png", format="PNG")
image.save("output_image.jpg", format="JPEG")
image.save("output_image.gif", format="GIF")

Управление качеством изображений

Особо важным является управление качеством изображения при сохранении в форматах сжатия, таких как JPEG. Вот пример, как это можно сделать.

def save_image_with_quality(image: Image.Image, save_path: str, quality: int) -> None:
    """
    Сохраняет изображение с указанным качеством.

    :param image: Объект изображения.
    :param save_path: Путь для сохранения изображения.
    :param quality: Качество изображения от 1 до 95.
    """
    image.save(save_path, format="JPEG", quality=quality)

Применение фильтров

Pillow также поддерживает применение фильтров для обработки изображений. Здесь мы рассмотрим пример, как применить фильтр и изменить размер изображения одновременно.

from PIL import ImageFilter

def apply_filter_and_resize(image: Image.Image, new_size: tuple[int, int]) -> Image.Image:
    """
    Применяет фильтр и изменяет размер изображения.

    :param image: Объект изображения.
    :param new_size: Новый размер изображения (ширина, высота).
    :return: Обработанное изображение.
    """
    filtered_image = image.filter(ImageFilter.SHARPEN)
    return filtered_image.resize(new_size, Image.ANTIALIAS)

Практическое применение

Изменение размера изображений особенно важно в веб-программировании и интернет-маркетинге. Например, на веб-сайтах для ускорения загрузки страниц и снижения трафика изображения часто сохраняются в нескольких размерах.

Пример проекта:

def process_images_for_web(input_folder: str, output_folder: str, sizes: list[tuple[int, int]]) -> None:
    """
    Обрабатывает изображения для веб-сайта, изменяя их размеры.

    :param input_folder: Папка с исходными изображениями.
    :param output_folder: Папка для сохранения обработанных изображений.
    :param sizes: Список размеров для изменения изображений.
    """
    from pathlib import Path

    input_path = Path(input_folder)
    output_path = Path(output_folder)
    output_path.mkdir(parents=True, exist_ok=True)

    for image_file in input_path.glob("*.jpg"):
        image = open_image(str(image_file))
        if image:
            for size in sizes:
                resized_image = resize_image(image, size)
                output_file = output_path / f"{image_file.stem}_{size[0]}x{size[1]}.jpg"
                save_image(resized_image, str(output_file))

# Пример использования
process_images_for_web("input_images", "output_images", [(800, 600), (400, 300), (200, 150)])

Ошибки и их обработка

Работа с изображениями может привести к различным ошибкам. Нам необходимо обрабатывать их, чтобы обеспечить устойчивость кода.

def safe_open_image(file_path: str) -> Image.Image:
    try:
        image = Image.open(file_path)
        return image
    except (FileNotFoundError, IOError) as e:
        print(f"Ошибка при открытии изображения: {e}")

def safe_save_image(image: Image.Image, save_path: str) -> None:
    try:
        image.save(save_path)
    except IOError as e:
        print(f"Ошибка при сохранении изображения: {e}")

Заключение

В этой статье мы рассмотрели, как работать с библиотекой Pillow для изменения размера изображений, применения фильтров, управления качеством и сохранения в различных форматах. Эти знания особенно полезны в веб-программировании и интернет-маркетинге для создания оптимизированного контента.


Добавить комментарий