Как конвертировать форматы изображений в Python

Введение
Python часто используют для небольших утилит, которые автоматизируют повседневные задачи. Конвертация форматов изображений — типичная задача: нужно быстро перевести PNG в JPG, JPG в PNG, сохранить прозрачность или массово преобразовать каталог.
В этой статье вы найдёте:
- базовые примеры с библиотекой Pillow;
- как проверять свойства изображения;
- советы по прозрачности и режимам (modes);
- обработку ошибок и пакетную конвертацию;
- чек‑лист и тесты для надёжного скрипта.
Важно: примеры сохраняют техническую точность и работают на актуальной версии Pillow. Термин «режим» (mode) в Pillow — строка, определяющая формат пикселя (например, “RGB”, “RGBA”).
Установка необходимых библиотек
Для работы используется библиотека Pillow — форк PIL с расширенной поддержкой форматов. Установите её командой:
pip install pillowЕсли вы используете виртуальное окружение (venv, pipenv, poetry), установите пакет туда, чтобы не менять глобальные зависимости.
Загрузка изображения и чтение свойств
Импортируйте модуль Image из PIL и откройте файл. Ниже — минимальный пример для загрузки и просмотра изображения:
from PIL import Image
image = Image.open('sample-image.jpg')
image.show()Чтобы получить метаданные и свойства изображения:
# Импортирование библиотеки
from PIL import Image
# Загрузка изображения
image = Image.open('sample-image.jpg')
# Имя файла
print("Filename:", image.filename)
# Формат (PNG, JPEG, GIF и т.д.)
print("Format:", image.format)
# Режим (RGB, RGBA, CMYK и т.д.)
print("Mode:", image.mode)
# Размер (width, height) в пикселях
print("Size:", image.size)
print("Width:", image.width)
print("Height:", image.height)
# Закрываем
image.close()Вывод примера выглядит примерно так (с реальными значениями для вашего файла):

Основы конвертации формата
Метод save() автоматически определяет формат по расширению файла в имени. Часто требуется корректно привести изображение к нужному режиму (mode): например, JPG не поддерживает альфа‑канал, поэтому нужно преобразовать RGBA → RGB и при необходимости залить фон.
Pillow поддерживает стандартные режимы:
- RGB — 3×8‑бит, истинный цвет;
- RGBA — RGB с альфа‑каналом (прозрачность);
- CMYK — 4×8‑бит для печати;
- L — градации серого (luminance);
- P — палитровый режим (например, GIF).
Конвертация PNG → JPG (с потерей прозрачности)
Если у изображения есть альфа‑канал и вы хотите получить JPG, нужно убрать альфа‑канал. Один из распространённых подходов — наложить изображение на белый фон (или любой другой):
from PIL import Image
# Загрузка
image = Image.open('sample-png-image.png')
# Если есть альфа, приводим к RGB на белом фоне
if image.mode == 'RGBA':
background = Image.new('RGB', image.size, (255, 255, 255))
background.paste(image, mask=image.split()[3]) # 3 — альфа канал
background.save('converted-jpg-image.jpg', 'JPEG')
else:
image.convert('RGB').save('converted-jpg-image.jpg', 'JPEG')
print('Image successfully converted!')Если просто вызвать image.convert(‘RGB’).save(…), прозрачность будет утеряна без контроля над цветом фона. Приведённый вариант даёт предсказуемый фон.
Конвертация JPG → PNG (сохранение прозрачности недоступно)
JPG не содержит прозрачности, поэтому простой переход в PNG даст обычное RGB/без‑альфа изображение:
from PIL import Image
image = Image.open('sample-jpg-image.jpg')
image.save('converted-png-image.png', 'PNG')
print('Image successfully converted!')Если нужно явно добавить прозрачность (например, сделать белый фон прозрачным), требуется дополнительная обработка маски — см. раздел про продвинутые примеры.
Конвертация в WebP и другие форматы
Принцип тот же: указываете нужное расширение или формат в save(). Для WebP:
from PIL import Image
image = Image.open('sample-transparent-png-image.png')
image.save('converted-webp-image.webp', 'WEBP')
print('Image successfully converted!')Обратите внимание: поддержка формата зависит от сборки Pillow (наличие соответствующих библиотек на системе). Если формат не поддерживается, Pillow бросит исключение OSError.
Обработка ошибок при отсутствии файла и при недоступных форматах
Всегда используйте try/except вокруг операций ввода‑вывода или конвертации:
from PIL import Image
try:
image = Image.open('wrong-filename.jpg')
image.save('converted-png-image.png')
print('Image successfully converted!')
except FileNotFoundError:
print("Не найден указанный файл")
except OSError as e:
print("Ошибка формата или сохранения:", e)Пакетная конвертация каталога
Для обработки всех файлов в папке удобно использовать модуль glob. Пример: конвертация всех JPG в PNG с обработкой ошибок:
from PIL import Image
import glob
import os
for file in glob.glob('*.jpg'):
try:
img = Image.open(file)
new_name = os.path.splitext(file)[0] + '.png'
img.save(new_name, 'PNG')
print(f'Converted {file} -> {new_name}')
except Exception as e:
print(f'Ошибка при обработке {file}:', e)Если нужно конвертировать все форматы в единый формат (например, в WebP), можно использовать шаблон glob.glob(‘*’) и фильтровать по расширениям или по успешному открытию через Image.open.
Продвинутые моменты и советы
- Массовая обработка и производительность: для тысяч изображений используйте batch‑подход, профилируйте I/O и, при необходимости, параллелизуйте конвертацию с помощью multiprocessing. Следите за пулом файловых дескрипторов.
- Качество и параметры: для JPEG можно задавать параметр quality (0–100), для WebP — quality и методы сжатия.
- EXIF и метаданные: при сохранении формата часть метаданных может потеряться. Чтобы сохранить EXIF, используйте параметр exif из объекта Image.info, где это поддерживается.
- Цветовой профиль: при конвертации для печати учитывайте профили ICC; Pillow поддерживает их частично.
Примеры обработки прозрачности и масок
Сделаем белый фон прозрачным и сохраним в PNG:
from PIL import Image
img = Image.open('photo-with-white-bg.jpg').convert('RGBA')
datas = img.getdata()
newData = []
for item in datas:
# если пиксель почти белый — делаем прозрачным
if item[0] > 240 and item[1] > 240 and item[2] > 240:
newData.append((255, 255, 255, 0))
else:
newData.append(item)
img.putdata(newData)
img.save('photo-with-transparent-bg.png', 'PNG')Такой подход подходит для простых случаев; для сложных фонов потребуются алгоритмы сегментации.
Чек‑лист перед деплоем скрипта конвертации (роль разработчика/оператора)
- Установлен Pillow в нужной версии в виртуальном окружении
- Проверена поддержка целевых форматов на тестовой машине
- Настроена обработка ошибок и логирование
- Добавлены ограничения по размеру входных файлов
- Тесты на нескольких образцах (прозрачность, CMYK, палитра)
- Резервное копирование исходных файлов перед массовой заменой
Таблица совместимости форматов (ориентир)
| Исходный формат | Можно конвертировать в | Примечания |
|---|---|---|
| PNG (RGBA) | JPG, PNG, WEBP, BMP | Если в JPG — альфа теряется; нужно определить фон |
| JPG | PNG, WEBP, BMP | JPG не содержит альфы |
| GIF (анимация) | GIF, WebP (аним.), PNG (первый кадр) | При преобразовании в PNG анимация потеряется |
| TIFF | PNG, JPG, WebP | TIFF может содержать многостраничные данные |
Критерии приёмки
- Скрипт корректно конвертирует тестовые файлы (PNG→JPG, JPG→PNG, PNG→WEBP).
- Альфа‑канал правильно обрабатывается согласно спецификации (заливка/маска).
- При ошибках создаётся лог с именем файла и текстом ошибки.
- Для пакетной обработки не теряются оригинальные файлы без явного подтверждения.
Быстрая методология для создания утилиты конвертации
- Подготовка: определить набор входных/выходных форматов и требования к качеству.
- Прототип: реализовать базовую конвертацию для одного файла.
- Тесты: создать набор тестовых изображений (разные режимы, прозрачность, EXIF).
- Масштабирование: добавить пакетную обработку, логирование, ограничение по памяти.
- Деплой: поместить в CLI/GUI и добавить инструкции по использованию.
Советы по GUI
Для простой утилиты с графическим интерфейсом используйте Tkinter (встроен в стандартную библиотеку) или более продвинутые фреймворки (PyQt, wxPython) при необходимости. Для быстрого прототипа достаточно минимального окна с выбором файлов и кнопкой “Конвертировать”.
Тестовые случаи и приёмка
- Конвертация PNG с прозрачностью → JPG: итоговое изображение не содержит альфы и фон соответствует ожидаемому (белый/заданный).
- Конвертация анимированного GIF → PNG: ожидается только первый кадр и предупреждение о потере анимации.
- Массовая конвертация 100 файлов: отсутствие падений, лог ошибок при неудачах.
Безопасность и приватность
- Проверяйте размеры и типы входных файлов, чтобы избежать DoS‑сценариев при приёме данных извне.
- Если обрабатываете пользовательские изображения, удаляйте или анонимизируйте чувствительные метаданные (EXIF, GPS), если это требуется по политике приватности.
Резюме
Pillow — надёжный инструмент для конвертации форматов изображений в Python. Простые операции выполняются за пару строк, но для надёжной утилиты нужны обработка прозрачности, логирование, тесты и ограничения по ресурсам. Следуйте чек‑листу перед вводом в эксплуатацию и убедитесь, что тесты покрывают реальные кейсы (альфа, палитра, многослойные форматы).
Краткие ключевые рекомендации:
- Всегда проверяйте image.mode и при необходимости приводите режим корректно;
- Для JPG явно удаляйте альфа‑канал с понятным фоном;
- При массовой обработке добавьте логирование и резервное копирование исходников;
- Тестируйте на реальных примерах с разными форматами и метаданными.
Похожие материалы
Оформление в MLA в Google Docs
Помощь при написании в Google Docs
Изменить шрифт по умолчанию в Google Docs и Word
Зачеркнуть текст в Google Docs — как и горячие клавиши
Диаграммы в Google Docs: создание и правка