
Python предоставляет несколько библиотек для работы с изображениями, среди которых Pillow и OpenCV занимают лидирующие позиции. С их помощью можно не только открывать и обрабатывать изображения, но и сохранять их в различных форматах, включая PNG, JPEG и BMP.
Выбор метода сохранения зависит от задачи: если требуется простое сохранение файла после обработки, достаточно функций save из Pillow. Для работы с видеофреймами и потоковыми изображениями удобнее использовать OpenCV с функцией imwrite.
При сохранении изображений важно учитывать параметры качества и разрешения. В формате JPEG можно регулировать степень сжатия с помощью аргумента quality, а для PNG доступна настройка optimize. Неправильная установка этих параметров может привести к потере деталей или увеличению размера файла.
Работа с изображениями из сети требует загрузки файлов через библиотеки requests или urllib, после чего их можно сохранить локально. Для надежного кода следует обрабатывать возможные ошибки при загрузке и сохранении файлов, включая отсутствие доступа к пути или некорректный формат.
Использование библиотеки Pillow для сохранения изображений

Пример базового сохранения:
- Импортировать библиотеку: from PIL import Image
- Открыть изображение: img = Image.open(‘input.jpg’)
- Сохранить файл в нужном формате: img.save(‘output.png’)
Pillow поддерживает настройку форматов и параметров:
- JPEG: аргумент quality регулирует сжатие (от 1 до 95). Например, img.save(‘output.jpg’, quality=85).
- PNG: можно включить оптимизацию: img.save(‘output.png’, optimize=True).
- GIF и BMP: поддерживаются стандартные методы без дополнительных параметров.
Для изменения пути сохранения достаточно указать полный путь к файлу, включая каталог. Pillow автоматически создаст файл, если путь корректен, но не создаёт промежуточные папки, поэтому их необходимо создавать заранее.
Важно проверять формат исходного файла перед сохранением. Некоторые форматы, например TIFF или ICO, требуют явного указания формата через аргумент format: img.save(‘output.tiff’, format=’TIFF’).
Сохранение изображений с помощью OpenCV

OpenCV предоставляет функции для работы с изображениями и видеофайлами в формате массива NumPy. Основная функция для сохранения изображений – cv2.imwrite(), которая поддерживает форматы PNG, JPEG, BMP и TIFF.
Пример базового сохранения:
- Импортировать библиотеку: import cv2
- Загрузить изображение: img = cv2.imread(‘input.jpg’)
- Сохранить изображение: cv2.imwrite(‘output.png’, img)
Для формата JPEG можно регулировать качество через параметр [int(cv2.IMWRITE_JPEG_QUALITY), 90], где 90 – уровень сжатия от 0 до 100. Пример:
cv2.imwrite('output.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 85])
Для PNG доступна настройка сжатия через [int(cv2.IMWRITE_PNG_COMPRESSION), 3], где 0 – отсутствие сжатия, а 9 – максимальное. Пример:
cv2.imwrite('output.png', img, [int(cv2.IMWRITE_PNG_COMPRESSION), 3])
OpenCV сохраняет изображения только в указанном каталоге, поэтому перед сохранением следует убедиться в существовании пути. Функция возвращает True, если сохранение прошло успешно, что удобно для проверки ошибок.
Работа с форматом PNG и JPEG в Python

При сохранении PNG через Pillow можно включить оптимизацию и указать прозрачность:
img.save('output.png', optimize=True, compress_level=3)
Для JPEG важен параметр качества, который влияет на размер и детализацию изображения. Значение quality=95 сохраняет почти полное качество, а quality=70 уменьшает размер файла почти в два раза:
img.save('output.jpg', quality=85, optimize=True)
В OpenCV JPEG и PNG сохраняются через cv2.imwrite(). Для JPEG уровень сжатия задаётся списком параметров:
cv2.imwrite('output.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
Для PNG в OpenCV используется параметр IMWRITE_PNG_COMPRESSION, где 0 – отсутствие сжатия, а 9 – максимальное:
cv2.imwrite('output.png', img, [int(cv2.IMWRITE_PNG_COMPRESSION), 3])
При работе с обоими форматами важно учитывать исходный размер изображения и требуемое качество, чтобы избежать чрезмерного увеличения файла или потери деталей.
Сохранение изображений из URL в локальные файлы

Для загрузки изображений из интернета используют библиотеки requests и urllib. После получения данных их можно сохранить на диск с указанием полного пути и имени файла.
Пример с использованием requests:
import requests
url = 'https://example.com/image.jpg'
response = requests.get(url)
if response.status_code == 200:
with open('image.jpg', 'wb') as f:
f.write(response.content)
Для работы с Pillow можно сразу открыть изображение из байтов и сохранить в другом формате:
from PIL import Image
from io import BytesIO
img = Image.open(BytesIO(response.content))
img.save('image.png', optimize=True)
С urllib процесс аналогичен:
import urllib.request
urllib.request.urlretrieve('https://example.com/image.jpg', 'image.jpg')
Перед сохранением важно проверять доступность URL и корректность формата. Для больших файлов рекомендуется сохранять потоками или использовать параметры stream=True в requests, чтобы избежать перегрузки памяти.
Изменение качества и размера при сохранении

При сохранении изображений важно контролировать качество и размер файла. В Pillow параметр quality применяется к JPEG, а optimize и compress_level – к PNG. В OpenCV аналогичные настройки задаются через IMWRITE_JPEG_QUALITY и IMWRITE_PNG_COMPRESSION.
Пример изменения качества JPEG в Pillow:
img.save('output.jpg', quality=80, optimize=True)
Для изменения размера изображения используют методы resize() или thumbnail(). Пример:
img_resized = img.resize((800, 600))
img_resized.save('output_resized.jpg', quality=85)
Сравнение параметров качества и сжатия для форматов JPEG и PNG:
| Формат | Параметр | Влияние | Рекомендация |
|---|---|---|---|
| JPEG | quality (1–95) | Сжатие с потерями, уменьшение качества при низких значениях | 80–90 для баланса между размером и детализацией |
| PNG | compress_level (0–9) | Без потерь, влияет на размер файла | 2–4 для умеренного сжатия без заметного замедления |
При работе с большими изображениями рекомендуется сначала изменять размер, а затем сохранять с оптимальными параметрами качества, чтобы уменьшить нагрузку на память и ускорить процесс записи.
Обработка ошибок при сохранении изображений

При сохранении изображений в Python возможны ошибки, связанные с доступом к файловой системе, некорректным форматом файла или отсутствием нужных каталогов. Для их обработки используют конструкции try-except.
Пример для Pillow:
from PIL import Image
try:
img = Image.open('input.jpg')
img.save('output.png')
except FileNotFoundError:
print('Файл input.jpg не найден')
except PermissionError:
print('Нет прав на запись в каталог')
except OSError as e:
print(f'Ошибка формата или сохранения: {e}')
В OpenCV функция cv2.imwrite() возвращает True, если сохранение прошло успешно, и False при ошибке. Пример проверки:
import cv2
img = cv2.imread('input.jpg')
if not cv2.imwrite('output.png', img):
print('Ошибка при сохранении файла')
Рекомендуется также проверять существование каталога перед сохранением и создавать его при необходимости:
import os
os.makedirs('images', exist_ok=True)
img.save('images/output.png')
Такая практика предотвращает потерю данных и позволяет логировать ошибки для последующего анализа.
Вопрос-ответ:
Какие библиотеки Python лучше использовать для сохранения изображений?
Для сохранения изображений подходят библиотеки Pillow и OpenCV. Pillow удобна для простых операций с отдельными файлами, поддерживает форматы JPEG, PNG, BMP и позволяет регулировать качество и оптимизацию. OpenCV полезна при работе с массивами изображений или видеофреймами, поддерживает параметры сжатия и возвращает статус сохранения файла для проверки ошибок.
Как сохранить изображение из интернета в локальную папку с помощью Python?
Сначала необходимо загрузить файл через библиотеку requests или urllib. Например, с requests делают GET-запрос к URL и сохраняют содержимое в бинарном режиме: with open(‘image.jpg’, ‘wb’) as f: f.write(response.content). Для изменения формата или оптимизации можно открыть изображение через Pillow и использовать save().
Как изменить качество и размер изображения перед сохранением?
Для JPEG в Pillow используется параметр quality (например, 80–90) и optimize=True для уменьшения размера без сильной потери деталей. Для PNG задают compress_level (0–9). Изменение размера выполняют методами resize() или thumbnail() перед сохранением. В OpenCV JPEG и PNG сохраняются с аналогичными параметрами сжатия через IMWRITE_JPEG_QUALITY и IMWRITE_PNG_COMPRESSION.
Что делать, если при сохранении изображения возникает ошибка доступа к файлу?
Следует использовать блоки try-except. Для Pillow можно ловить FileNotFoundError, PermissionError и OSError. В OpenCV проверяют возвращаемое значение cv2.imwrite() — False указывает на ошибку. Рекомендуется создавать каталоги заранее с os.makedirs(path, exist_ok=True) и проверять права на запись.
В чем разница между форматами PNG и JPEG при сохранении изображений?
PNG сохраняет изображение без потерь и поддерживает прозрачность, подходит для графики и скриншотов. JPEG использует сжатие с потерями, что уменьшает размер файла, но снижает детализацию, особенно при низких значениях качества. Для PNG важен compress_level, для JPEG — quality и параметр optimize. Выбор формата зависит от того, важна ли точность пикселей или требуется уменьшение размера.
