PIL.Image.open: примеры (PYTHON)

Открытие изображений с помощью PIL.Image.open: примеры и особенности
Раздел: Pillow, Ввод/вывод изображений
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'.

Расширенные примеры

Открытие изображения с указанием возможных форматов:

Пример python
# Если расширение файла не соответствует содержимому
img = Image.open('file.dat', formats=['JPEG', 'PNG'])
print(img.format)
JPEG

Открытие и работа с многостраничным изображением (TIFF):

Пример python
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)

Открытие изображения с применением пользовательского декодера (концептуально):

Пример python
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}")
# Результат зависит от состояния файла

Использование в контекстном менеджере для автоматического закрытия файла:

Пример python
with Image.open('large_image.tiff') as img:
    # Изображение будет закрыто автоматически после выхода из блока
    gray_img = img.convert('L')
    gray_img.save('gray_large_image.tiff')
# Здесь img больше не доступно для операций, требующих данных файла
# Файловый дескриптор освобожден

питон PIL.Image.open function comments

En
PIL.Image.open Open image file