PIL.Image.open: примеры (PYTHON)
PIL.Image.open(fp: str/bytes): Image objectОписание функции PIL.Image.open
Функция Image.open из модуля PIL (библиотека Pillow) является основным методом для открытия и загрузки изображений в Python. Она используется для чтения файлов изображений с диска, из файловых объектов или байтовых потоков с последующей возможностью их обработки.
Функция не загружает все данные пикселей в память сразу, а открывает файл и считывает только заголовок для определения формата и основных характеристик. Сами данные пикселей загружаются по мере необходимости (ленивая загрузка).
Синтаксис и параметры
PIL.Image.open(fp, mode='r', formats=None)
- fp (обязательный): Может быть путем к файлу (строка, pathlib.Path), файловым объектом (с методами read, seek, tell) или байтовым потоком (bytes, io.BytesIO).
- mode (необязательный, по умолчанию 'r'): Режим открытия. Обычно используется 'r' для чтения. В текущих версиях Pillow этот параметр имеет ограниченное применение и чаще всего остается значением по умолчанию.
- formats (необязательный): Список или кортеж строк с названиями форматов, которые следует испробовать для открытия файла. Используется, когда формат не может быть определен автоматически.
Возвращаемое значение
Функция возвращает объект PIL.Image.Image. Этот объект содержит метаданные изображения и предоставляет методы для работы с данными. Важно отметить, что изображение может быть не полностью загружено в память до выполнения операций, требующих данных пикселей (например, load(), getdata()).
Базовые примеры использования
Открытие изображения по пути к файлу:
from PIL import Image
img = Image.open('image.jpg')
print(f"Формат: {img.format}, Размер: {img.size}, Режим: {img.mode}")Формат: JPEG, Размер: (1920, 1080), Режим: RGB
Открытие изображения из файлового объекта:
with open('image.png', 'rb') as f:
img = Image.open(f)
img.show()# Откроется окно с изображением
Открытие изображения из байтов (например, из сети):
import io
import requests
response = requests.get('https://example.com/photo.png', stream=True)
img_data = response.content
img = Image.open(io.BytesIO(img_data))
img.thumbnail((100, 100))
img.save('thumbnail.png')# Файл 'thumbnail.png' сохранен
Похожие функции в Python
- PIL.Image.fromarray: Создает объект Image из массива NumPy. Используется при работе с научными вычислениями и компьютерным зрением (библиотеки like OpenCV, scikit-image).
- PIL.Image.new: Создает новое пустое изображение заданного размера и режима, а не открывает существующий файл.
- imageio.imread: Функция из библиотеки imageio, которая также читает изображения и часто возвращает массив NumPy. Удобна для последовательностей изображений (видео).
- cv2.imread: Функция из OpenCV. Возвращает изображение в виде массива NumPy в порядке каналов BGR, а не RGB. Предпочтительна для задач компьютерного зрения.
Функцию Image.open используют, когда требуется работа в экосистеме Pillow для базовой обработки, конвертации форматов или создания простой графики. Для интеграции с NumPy или OpenCV чаще применяют альтернативные методы.
Аналоги в других языках программирования
JavaScript (в браузере)
// Создание элемента Image
const img = new Image();
img.src = 'image.jpg';
img.onload = function() {
console.log(`Ширина: ${img.width}, Высота: ${img.height}`);
};// Асинхронная загрузка, данные доступны в обработчике onload
Java (с использованием ImageIO)
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.image.BufferedImage;
File file = new File("image.jpg");
BufferedImage image = ImageIO.read(file);
System.out.println("Ширина: " + image.getWidth());Ширина: 1920
Golang (с использованием стандартного image)
import (
"fmt"
"image"
_ "image/jpeg"
"os"
)
file, _ := os.Open("image.jpg")
defer file.Close()
img, format, _ := image.Decode(file)
fmt.Printf("Формат: %s, Размер: %v", format, img.Bounds().Size())Формат: jpeg, Размер: (1920 1080)
В отличие от Pillow, где объект Image содержит методы для обработки, во многих других языках функции чтения возвращают "сырые" данные (массивы, буферы), а операции выполняются отдельными функциями или методами других библиотек.
Типичные ошибки
Файл не найден (FileNotFoundError):
Image.open('несуществующий_файл.jpg')FileNotFoundError: [Errno 2] No such file or directory: 'несуществующий_файл.jpg'
Невозможно определить формат или файл поврежден:
# Попытка открыть текстовый файл как изображение
Image.open('text.txt')UnidentifiedImageError: cannot identify image file 'text.txt'
Ошибка, связанная с недостатком прав на чтение файла:
# Файл с правами, запрещающими чтение
Image.open('/root/protected_image.png')PermissionError: [Errno 13] Permission denied: '/root/protected_image.png'
Попытка использования закрытого файлового объекта:
file = open('image.jpg', 'rb')
file.close()
Image.open(file)ValueError: I/O operation on closed file.
Изменения в последних версиях
В версии Pillow 9.0.0 (январь 2022) была улучшена поддержка пути в виде объекта pathlib.Path для параметра fp.
В версии 8.0.0 появилась более строгая проверка целостности файлов для некоторых форматов, что может приводить к увеличению количества исключений UnidentifiedImageError для поврежденных файлов, которые раньше открывались без ошибок.
Параметр mode постепенно теряет актуальность, и его поддержка может быть ограничена. Рекомендуется использовать значение по умолчанию 'r'.
Расширенные примеры
Открытие изображения с указанием возможных форматов:
# Если расширение файла не соответствует содержимому
img = Image.open('file.dat', formats=['JPEG', 'PNG'])
print(img.format)JPEG
Открытие и работа с многостраничным изображением (TIFF):
img = Image.open('multipage.tiff')
for i in range(img.n_frames):
img.seek(i)
# Обработка каждого кадра
print(f"Кадр {i}: {img.size}")
img.save(f"frame_{i}.png")Кадр 0: (800, 600) Кадр 1: (800, 600)
Открытие изображения с применением пользовательского декодера (концептуально):
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True # Попытка загрузить усеченные файлы
try:
img = Image.open('possibly_corrupt.jpg')
img.load() # Загрузка данных в память
except IOError as e:
print(f"Ошибка загрузки: {e}")# Результат зависит от состояния файла
Использование в контекстном менеджере для автоматического закрытия файла:
with Image.open('large_image.tiff') as img:
# Изображение будет закрыто автоматически после выхода из блока
gray_img = img.convert('L')
gray_img.save('gray_large_image.tiff')
# Здесь img больше не доступно для операций, требующих данных файла# Файловый дескриптор освобожден