Сообщить об ошибке.

Атрибуты и методы объекта Image модуля Pillow

Объект Image представляет экземпляр открытого/созданного изображения. Для создания объектов Image используются соответствующие фабричные функции:

  • Функция PIL.Image.open() - открывает изображение;
  • Функция PIL.Image.new() - создает новое изображение;
  • Функция PIL.Image.frombytes() - создает новое изображение из массива байтов.

Атрибуты и методы объекта Image модуля Pillow.


Атрибуты объекта Image.

Экземпляры класса Image имеют следующие атрибуты:

Image.filename:

Атрибут Image.filename это имя файла или путь к исходному файлу изображения.

Только изображения, созданные с помощью фабричной функции PIL.Image.open(), имеют атрибут Image.filename. Если входные данные представляют собой объект, подобный файлу, то атрибуту Image.filename присваивается значение пустой строки.

Image.format:

Атрибут Image.format представляет собой формат исходного файла. Для изображений, созданных самой библиотекой (с помощью PIL.Image.new() или путем изменения существующего изображения), этому атрибуту присвоено значение None.

Image.mode: str:

Атрибут Image.mode представляет собой режим изображения. Это строка, указывающая формат пикселей, используемый изображением. Типичные значения: 1, L, RGB или CMYK.

Полный список поддерживаемых режимов смотрите в разделе "Модель и режим изображений".

Image.size:

Атрибут Image.size представляет собой размер изображения в пикселях. Размер задается как кортеж (width, height).

Image.width:

Атрибут Image.width представляет собой ширину изображения, в пикселях.

Image.height:

Атрибут Image.height представляет собой высоту изображения, в пикселях.

Image.palette:

Атрибут Image.palette представляет собой таблицу цветовой палитры, если таковая имеется.

Если режим изображения установлен в P или PA, это должен быть экземпляр класса PIL.ImagePalette.ImagePalette. В противном случае для него должно быть установлено значение None.

Image.info:

Атрибут Image.info представляет собой словарь, содержащий данные, связанные с изображением. Этот словарь используется обработчиками файлов для передачи различной информации, не относящейся к изображениям, считанной из файла.

Например, атрибут Image.info может хранить сведения об ориентации изображения при его просмотре в программе-просмотрщике изображений. Например, тег может указывать, что изображение повернуто на 90 градусов или зеркально отражено.

Большинство методов игнорируют словарь при возврате новых/измененных изображений. Так как ключи не стандартизированы, методы не знают, повлияет ли проводимая ими операция на словарь. Если эта информация может понадобится позже, то необходимо сохранить ссылку на атрибут Image.info, возвращенный функцией PIL.Image.open().

from PIL import Image

with Image.open('test.jpg') as img:
    # сохраним словарь 
    info = img.info

Этот словарь не влияет на сохранение файлов, если не указано иное.

Дополнительно смотрите материал "Особые параметры чтения/записи основных форматов изображений"

Image.is_animated:

Атрибут Image.is_animated возвращает True, если это изображение имеет более одного кадра, или False в противном случае.

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

Принимая во внимание, что этот атрибут присутствует только у анимированных изображений, для проверки присутствия анимации в изображении независимо от его формата необходимо использовать функцию getattr(img, 'is_animated', False).

Дополнительно смотрите методы Image.n_frames, Image.seek() и Image.tell().

Image.n_frames:

Атрибут Image.n_frames возвращает количество кадров в анимированном изображении.

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

Принимая во внимание, что этот атрибут присутствует только у анимированных изображений, для проверки присутствия анимации в изображении независимо от его формата необходимо использовать функцию getattr(img, 'n_frames', 1).

Дополнительно смотрите методы Image.is_animated, Image.seek() и Image.tell().

Методы объекта Image.

Экземпляр класса Image имеет следующие методы.

Если не указано иное, все методы возвращают новый экземпляр класса Image, содержащий результирующее/измененное изображение.

Image.alpha_composite(im, dest=(0, 0), source=(0, 0)):

Метод Image.alpha_composite() накладывает изображение im на изображение Image.

Аргументы:

  • im: изображение для наложения.
  • dest: необязательный кортеж (left, top), определяющий левый верхний угол целевого изображения.
  • source: необязательный кортеж (left, top), определяющий левый верхний угол изображения наложения или кортеж (left, top, right, bottom) для границ исходного прямоугольника

Метод является аналогом функции PIL.Image.alpha_composite().

Image.apply_transparency():

Метод Image.apply_transparency() применяет прозрачность к палитре, если изображение в режиме P имеет в словаре Image.info ключ transparency, после чего удаляет этот ключ из словаря. В противном случае изображение не меняется.

Image.convert(mode=None, matrix=None, dither=None, palette=Palette.WEB, colors=256):

Метод Imag.convert() возвращает преобразованную копию этого изображения. Для режима mode='P' этот метод переводит пиксели через палитру. Если mode опущен, то выбирается режим, при котором вся информация в изображении и палитре может быть представлена без палитры.

Метод Imag.convert() поддерживает все возможные преобразования между L, RGB и CMYK. Аргумент matix поддерживает только L и RGB.

При переводе цветного изображения в оттенки серого (режим L) библиотека использует преобразование яркости ITU-R 601-2:

L = R * 299/1000 + G * 587/1000 + B * 114/1000

Преобразование изображения в оттенках серого (L) или RGB по умолчанию в двухуровневое изображение (режим 1), метод Imag.convert() использует сглаживание Флойда-Стейнберга для приближения уровней яркости исходного изображения. Если значение dither равно None, то все значения, превышающие 127, устанавливаются равными 255 (белый), все остальные значения равны 0 (черный). Для установки других пороговых значений, необходимо использовать метод Image.point().

При преобразовании из RGBA в P без аргумента matix, метод передает операцию Image.quantize(), а дизеринг и палитра игнорируются.

При преобразовании из PA, если присутствует палитра RGBA, вместо значений из палитры будет использоваться альфа-канал из изображения.

  • mode: Запрошенный режим. Смотрите "Модель и режим изображений".
  • matrix: Необязательная матрица преобразования. Если указано, это должно быть 4 или 12 кортежей, содержащих значения с плавающей запятой.
  • dither: Метод сглаживания, используемый при преобразовании из режима RGB в P или из RGB или L в 1. Доступными методами являются: Dither.NONE или Dither.FLOYDSTEINBERG (по умолчанию) Обратите внимание, что метод сглаживания не используется, когда указана матрица преобразования.
  • palette: Палитра для использования при преобразовании из режима RGB в P. Доступные палитры: Palette.WEB или Palette.ADAPTIVE.
  • colors: Количество цветов для палитры Palette.ADAPTIVE. По умолчанию 256.

В следующем примере изображение RGB (линейно откалиброванное в соответствии с ITU-R 709 с использованием источника света D65) преобразуется в цветовое пространство CIE XYZ:

rgb2xyz = (0.412453, 0.357580, 0.180423, 0,
    0.212671, 0.715160, 0.072169, 0,
    0.019334, 0.119193, 0.950227, 0)

out = im.convert("RGB", rgb2xyz)

Image.copy():

Метод Image.copy() копирует это изображение. Метод используется для сохранения оригинального изображения при его последующем изменении.

Image.crop(box=None):

Метод Image.crop() возвращает прямоугольную область из изображения.

Аргумент box представляет собой кортеж (left, upper, right, lower), left и upper - это координаты в пикселях левого верхнего угла вырезаемой области, а right и lower нижний левый угол прямоугольной области. Смотрите "Система координат".

Следующий код обрезает входное изображение по переданным координатам:

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # задаем координаты вырезаемой области.
    (left, upper, right, lower) = (20, 20, 500, 500)
    # здесь изображение `img` обрезается и 
    # присваивается новой переменной `img_crop`.
    img_crop = img.crop((left, upper, right, lower))
    # сохраним вырезанную область.
    img_crop.save("test_crop.jpg")

Image.draft(mode, size):

Метод Image.draft() настраивает загрузчик файла изображения таким образом, чтобы он возвращал версию изображения, максимально соответствующую заданному режиму mode и размеру size.

Метод Image.draft() можно использовать для преобразования цветного JPEG изображения в оттенки серого при его загрузке.

При внесении каких-либо изменений возвращает кортеж с выбранным режимом mode и блок с координатами исходного изображения.

Обратите внимание, что этот метод изменяет объект изображения на месте. Если изображение уже загружено, то метод не работает.

Примечание. Этот метод реализован только для изображений JPEG и MPO.

  • mode: Запрошенный режим.
  • size: Запрошенный размер в пикселях (width, height).

Image.effect_spread(distance):

Метод Image.effect_spread() случайно распределяет пиксели в изображении. Аргумент distance определяет расстояние в котором распределяются пиксели.

from PIL import ImageGrab
import time

# 2 секунды на выбор окна
time.sleep(2)
# скриншот выбранного окна
img = ImageGrab.grab()
# применение метода к копии скриншота 
# и сохранение полученной картинки
img.effect_spread(5).save('effect_spread_5.png')
img.effect_spread(10).save('effect_spread_10.png')
img.effect_spread(20).save('effect_spread_20.png')
img.save('screenshot.png')

Image.entropy(mask=None, extrema=None):

Метод Image.entropy() вычисляет и возвращает энтропию для изображения.

С помощью этого метода двухуровневое изображение (режим 1) обрабатывается как изображение в оттенках серого (L).

  • mask: необязательная маска.
  • extrema: необязательный набор экстремумов, заданных вручную.

Если предоставлена маска mask, то метод использует гистограмму для тех частей изображения, где изображение маски не равно нулю. Изображение маски должно иметь тот же размер, что и изображение, и быть либо двухуровневым изображением (режим 1), либо изображением в градациях серого (L).

Image.filter(filter):

Метод Image.filter() изменяет это изображение, используя заданный фильтр. Список доступных фильтров смотрите в модуле ImageFilter.

Пример, где входное изображение размывается с помощью фильтра из модуля ImageFilter:

from PIL import Image, ImageFilter, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # Размытие входного изображения с 
    # помощью фильтра ImageFilter.BLUR
    img_blurred = img.filter(filter=ImageFilter.BLUR)
    img_blurred.save('img_blurred.jpg')
    # смотрим что получилось
    img_blurred.save("test_blurred.jpg")

Image.frombytes(data, decoder_name='raw', *args):

Метод Image.frombytes() загружает в исходное изображение пиксельные данные из объекта bytes.

Этот метод похож на функцию PIL.Image.frombytes(), но загружает данные в это изображение вместо создания нового объекта изображения.

Image.getbands():

Метод Image.getbands() возвращает кортеж, содержащий название каждого канала этого изображении. Например, для изображения RGB возвращает ('R', 'G', 'B').

Код ниже получает полосы входного изображения:

from PIL import Image

with Image.open("test.jpg") as img:
    print(img.getbands())  

# ('R', 'G', 'B')

Image.getbbox():

Метод Image.getbbox() вычисляет и возвращает ограничивающую рамку ненулевых областей изображения.

Ограничивающая рамка возвращается как четырехзначный кортеж, определяющий левую, верхнюю, правую и нижнюю координаты пикселя.

Если изображение полностью пусто, этот метод возвращает None.

Код ниже получает координаты ограничивающей рамки входного изображения:

from PIL import Image, ImageDraw, ImageFont

# создадим изображение с надписью
img = Image.new('RGB', (1000, 500))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=100)
# накладываем текст
draw.text((100, 250), text, font=font, fill='#ffffff')
# сохраним полученное ипзображение для сравнения
img.save('img.png')
# вычислим рамку, ограничивающую надпись
box = img.getbbox()
# напечатаем координаты рамки
print(box)
# вырежем надпись
img_crop = img.crop(box)
# смотрим что получилось
img_crop.save('img_crop.png')

Image.getchannel(channel):

Метод Image.getchannel() возвращает изображение в режиме L, содержащее один канал исходного изображения.

Аргумент channel это имя или индекс канала, который необходимо вернуть. Может быть индексом (0 для канала R изображения RGB) или именем канала (A для альфа-канала изображения RGBA).

Image.getcolors(maxcolors=256):

Метод Image.getcolors() возвращает список цветов, используемых в этом изображении в виде несортированных значений (count_pixel, (r,g,b)).

Например, изображение RGB вернет набор цветовых значений (r,g,b), а изображение P вернет индекс цвета в палитре.

Аргумент maxcolors — максимальное количество цветов. Если это число превышено, метод возвращает None. Ограничение по умолчанию - 256 цветов.

from PIL import Image, ImageDraw, ImageFont

# создадим изображение
text = 'docs-python.ru'
text_size = 50
img_width = len(text) * 25
img_height = text_size * 2 
img = Image.new('RGB', (img_width, img_height))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=text_size)
draw.text((10, text_size/2), text, font=font, fill='#ffffff')
# сохраним полученное изображение для сравнения
img.save(f'{text}.png')
# список цветов, используемых в изображении `img`
colors = img.getcolors()
# сортируем
colors = sorted(colors, key=lambda x: x[0], reverse=True)
# выводим 2 наиболее часто изпользуемых цвета в изображении
print(colors[:2])
# [(30803, (0, 0, 0)), (2505, (255, 255, 255))]

Image.getdata(band=None):

Метод Image.getdata() возвращает содержимое этого изображения в виде объекта последовательности, которое содержит значения пикселей. Объект последовательности выравнивается, так что значения для первой строки следуют сразу после значений нулевой строки и т. д.

Обратите внимание, что объект последовательности, возвращаемый этим методом, является внутренним типом данных библиотеки Pillow, который поддерживает только определенные операции с последовательностями. Чтобы преобразовать его в обычную последовательность (например, для печати), используйте list(im.getdata()).

Аргумент band означает, какую группу вернуть. По умолчанию возвращаются все каналы. Чтобы вернуть один канал, нужно передать значение индекса (например, 0, чтобы получить R-канал из изображения RGB).

from PIL import Image, ImageDraw, ImageFont

# создадим изображение
text = 'docs-python.ru'
text_size = 50
img_width = len(text) * 25
img_height = text_size * 2 
img = Image.new('RGB', (img_width, img_height))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=text_size)
draw.text((10, text_size/2), text, font=font, fill='#ffffff')
# получим содержимое изображения 
# в виде объекта последовательности
data = img.getdata()
print(list(data))

Image.getexif()
Image._getexif()
:

Метод Image.getexif() возвращает словарь основных, доподлинно известных EXIF тегов этого изображения.

Метод Image._getexif() возвращает словарь всех EXIF тегов этого изображения.

Код ниже расшифровывает ключи в словаре EXIF тегами изображения:

from PIL import Image, ExifTags

tags = ExifTags.TAGS
with Image.open('test.jpg') as img:
    # получаем значение exif тегов
    exif = img._getexif()
    for key, val in exif.items():
        print(tags.get(key, key), ':', val)

Примечание: подмодуль PIL.ExifTags предоставляет несколько классов enum.IntEnum, которые предоставляют константы и имена в открытом виде для различных известных тегов EXIF.

Image.getextrema():

Метод Image.getextrema() получает минимальное и максимальное значения пикселей для каждого канала изображения.

  • Для одноканального изображения возвращается кортеж из двух элементов, содержащий минимальное и максимальное значение пикселя.
  • Для многоканального изображения возвращается кортеж, содержащий по одному кортежу из двух элементов для каждого канала.

Image.getpalette(rawmode='RGB'):

Метод Image.getpalette() возвращает палитру изображения в виде списка цветовых значений [r, g, b, ...] или None, если изображение не имеет палитры.

Аргумент rawmode - режим, в котором нужно вернуть палитру. Значение None вернет палитру в ее текущем режиме.

Image.getpixel(xy):

Метод Image.getpixel() возвращает значение цвета пикселя в заданной позиции xy. Если изображение является многоканальным, этот метод возвращает кортеж.

Аргумент xy это координата в виде кортежа (x, y).

from PIL import Image, ImageDraw, ImageFont

# создадим изображение
text = 'docs-python.ru'
text_size = 50
img_width = len(text) * 25
img_height = text_size * 2 
img = Image.new('RGB', (img_width, img_height))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=text_size)
draw.text((10, text_size/2), text, font=font, fill='#ffffff')
# получим цвет пикселя 
# в позиции (12,50)
print(img.getpixel((12,50)))
# (255, 255, 255) - белый
print(img.getpixel((11,50)))
# (106, 106, 106) - серый
print(img.getpixel((10,50)))
# (0, 0, 0) - черный

Image.getprojection():

Метод Image.getprojection() получает проекцию на оси x и y. Возвращает две последовательности, указывающие, где находятся ненулевые пиксели по оси X и оси Y соответственно.

Image.histogram(mask=None, extrema=None):

Метод Image.histogram() возвращает гистограмму изображения (список, содержащий количество пикселей).

Гистограмма возвращается в виде списка количества пикселей, по одному для каждого значения пикселя в исходном изображении. Счетчики сгруппированы в 256 бинов для каждого канала, даже если изображение имеет более 8 бит на канал. Если изображение содержит более одного канала, то гистограммы для всех каналов объединяются (например, гистограмма для изображения RGB содержит 768 значений).

  • Аргумент mask: Необязательная маска.
  • Аргумент extrema: Необязательный кортеж экстремумов, заданных вручную.

С помощью этого метода двухуровневое изображение (режим 1) обрабатывается как изображение в оттенках серого (L).

Если маска равна не None, то метод возвращает гистограмму для тех частей изображения, где изображение маски не равно нулю. Маска должна иметь тот же размер, что и изображение, и быть либо двухуровневым изображением (1), либо изображением в градациях серого (L).

Image.paste(im, box=None, mask=None):

Метод Image.paste() вставляет другое изображение im в это изображение.

Аргумент box представляет собой либо 2-кортеж, задающий верхний левый угол, либо 4-кортеж, определяющий левую, верхнюю, правую и нижнюю пиксельные координаты, либо None (то же, что (0, 0)). Если дается 4-кортеж, то размер вставляемого изображения должен соответствовать размеру региона.

Если режимы изображений не совпадают, то вставленное изображение преобразуется в режим этого изображения (подробности в методе Image.convert()).

Вместо изображения, источником может быть целое число или кортеж, содержащий значения пикселей. Затем метод заполняет область заданным цветом. При создании изображений в режиме RGB можно использовать цветовые хеш строки, например, #ffffff - белый цвет.

Если задана маска mask, то этот метод обновляет только области, указанные маской. Можно использовать изображения в режимах 1, L, LA, RGBA или RGBa (если присутствует, альфа-диапазон используется в качестве маски). Если маска равна 255, то данное изображение копируется как есть. Если маска равна 0, то текущее значение сохраняется. Промежуточные значения будут смешивать два изображения вместе, включая их альфа-каналы, если они есть.

Если нужно объединить изображения относительно их альфа-каналов, то дополнительно смотрите метод Image.alpha_composite().

Image.point(lut, mode=None):

Метод Image.point() сопоставляет это изображение с помощью таблицы поиска или функции lut.

Аргумент lut - таблица поиска, содержащая 256 (или 65536, если self.mode == 'I' и mode == 'L') значений для каждой полосы на изображении. Вместо таблицы можно использовать функцию, которая должна принимать один аргумент. Функция вызывается один раз для каждого возможного значения пикселя, и результирующая таблица применяется ко всем полосам изображения.

Это также может быть объект ImagePointHandler:

from PIL import Image

class Example(Image.ImagePointHandler):
  def point(self, data):
    # Возвращает результат

Аргумент mode – режим вывода (по умолчанию тот же, что и на входе). Аргумент можно использовать только в том случае, если исходное изображение имеет режим L или P, а выходной режим - 1, или режим исходного изображения - I, а выходной режим - L.

Пример преобразования картинки в "сканированное" изображение с порогом 120:

from PIL import ImageGrab
import time

# делаем задержку в 2 секунды, что бы 
# успеть переключиться на нужное окно 
time.sleep(2)
# делаем скриншот
img = ImageGrab.grab()
# т.е. применяем к каждому пикселю картинки функцию `fn`
threshold = 120
fn = lambda x : 255 if x > threshold else 0
# обесцвечивает картинку
img = img.convert('L')
# "сканируем" изображение
scan = img.point(fn)
# сохраняем
scan.save('scrshoot_scan.png')

Image.putalpha(alpha):

Метод Image.putalpha() добавляет или заменяет альфа-канал alpha в этом изображении. Если изображение не имеет альфа-канала, то оно преобразуется в LA или RGBA. Новый слой должен быть либо L, либо 1.

Аргумент alpha - может быть либо изображение L или 1, имеющее тот же размер, что и исходное изображение, либо целое число или другое значение цвета.

Image.putdata(data, scale=1.0, offset=0.0):

Метод Image.putdata() копирует пиксельные данные из объекта сглаженной последовательности data в изображение. Значения должны начинаться с верхнего левого угла (0, 0), продолжаться до конца строки, за которым непосредственно следует первое значение второй строки и так далее.

Данные будут считываться до тех пор, пока изображение или последовательность не закончатся. Значения scale и offset используются для настройки значений последовательности: pixel = value * scale + offset.

Аргументы:

  • data: Сглаженный объект последовательности.
  • scale: Необязательное значение масштаба. Значение по умолчанию равно 1.0.
  • offset: Необязательное значение смещения. Значение по умолчанию равно 0.0.

Image.putpalette(data, rawmode='RGB'):

Метод Image.putpalette() прикрепляет палитру data к этому изображению. Исходное изображение должно быть в режиме P, PA, L или LA.

Последовательность палитры data должна содержать не более 256 цветов, состоящих из одного целочисленного значения для каждого канала в необработанном режиме. Например, если необработанный режим rawmode='RGB', то он может содержать не более 768 значений, состоящих из значений красного, зеленого и синего для соответствующего индекса пикселя в 256 цветах. Если необработанный режим RGBA, то он может содержать не более 1024 значений, содержащих значения красного, зеленого, синего и альфа-канала.

В качестве альтернативы вместо целочисленной последовательности можно использовать 8-битную строку.

  • Аргумент data - последовательность палитр (либо список, либо строка).
  • Аргумент rawmode это необработанный режим палитры. Либо RGB, RGBA, либо режим, который можно преобразовать в RGB или RGBA.

Image.putpixel(xy, value):

Метод Image.putpixel() изменяет значение пикселя на value в заданном положении xy. Цвет задается в виде одного числового значения для одноканальных изображений и кортежа для многоканальных изображений. В дополнение к этому, кортежи RGB и RGBA принимаются для изображений в режимах P и PA.

Обратите внимание, что этот метод относительно медленный. Для более масштабных изменений необходимо использовать метод Image.paste() или модуль ImageDraw.

Image.quantize(colors=256, method=None, kmeans=0, palette=None, dither=Dither.FLOYDSTEINBERG):

Метод Image.quantize() преобразует изображение в режим P с указанным количеством цветов.

  • colors: Желаемое количество цветов, <= 256
  • palette: Квантовать в палитру заданных PIL.Image.Image.
  • dither: Метод сглаживания, используемый при преобразовании из режима RGB в P или из RGB или L в 1. Доступные методы: Dither.NONE или Dither.FLOYDSTEINBERG (по умолчанию).
  • method: Quantize.MEDIANCUT (срединный разрез), Quantize.MAXCOVERAGE (максимальный охват), Quantize.FASTOCTREE (быстрое октодерево), Quantize.LIBIMAGEQUANT (libimagequant; проверить поддержку с помощью PIL.features.check_feature() с аргументом feature="libimagequant"). По умолчанию будет использоваться Quantize.MEDIANCUT.

    Исключение составляют изображения RGBA. Quantize.MEDIANCUT и Quantize.MAXCOVERAGE не поддерживают изображения RGBA, вместо них по умолчанию используется Quantize.FASTOCTREE.

Image.reduce(factor, box=None):

Метод Image.reduce() возвращает копию изображения, уменьшенную в несколько раз. Если размер изображения не делится на коэффициент factor, то полученный размер будет округлен в большую сторону.

  • аргумент factor: Целое число больше 0 или кортеж из двух целых чисел для ширины и высоты отдельно.
  • аргумент box: Необязательный кортеж из 4 целых чисел, обеспечивающий уменьшение области исходного изображения. Значения должны быть в пределах прямоугольника (0, 0, ширина, высота). Если опущено или None, используется все изображение.

Image.remap_palette(dest_map, source_palette=None):

Метод Image.remap_palette() перезаписывает изображение, с измененным порядком палитры.

  • аргумент dest_map: Список индексов исходной палитры. Например [1,0] поменяет местами палитру из двух элементов, а list(range(256)) - это преобразование идентичности.
  • аргумент source_palette: Байты или None.

Image.resize(size, resample=None, box=None, reducing_gap=None):

Метод Image.resize() возвращает измененную копию этого изображения.

Аргументы:

  • size: запрошенный размер в пикселях в виде кортежа: (width, height).
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BOX, Resampling.BILINEAR, Resampling.HAMMING, Resampling.BICUBIC или Resampling.LANCZOS. Если изображение имеет режим 1 или P, то для него всегда устанавливается Resampling.NEAREST. Если в режиме изображения указано количество битов, например I;16, то фильтром по умолчанию является Resampling.NEAREST. В противном случае фильтром по умолчанию является Resampling.BICUBIC. Смотрите "Встроенные фильтры передискретизации".
  • box: необязательный 4-х значный кортеж со значениями float, обеспечивающий масштабируемую область исходного изображения. Значения должны быть в пределах прямоугольника (0, 0, width, height). Если опущено или None, то используется весь источник.
  • reducing_gap: значение оптимизации, которая изменяет размер изображения в два шага. Во-первых, изображение уменьшается в целое число раз с помощью метода Image.reduce(). Во-вторых, размер изменяется с помощью обычной передискретизации. Передискретизация изменяет размер не меньше, чем reducing_gap. Значение reducing_gap может быть равно None (первый шаг не выполняется) или должно быть больше 1.0. Чем больше reducing_gap, тем ближе результат к справедливой повторной выборке. Чем меньше reducing_gap, тем быстрее изменяется размер. Если значение reducing_gap больше или равно 3.0, то результат в большинстве случаев неотличим от справедливой повторной выборки. Значение по умолчанию - None (оптимизация отсутствует).

Код ниже изменяет размер изображения с (width, height) на (width/2, height/2):

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # целевая ширина и высота изображения
    (width, height) = (img.width // 2, img.height // 2)
    img_resized = img.resize((width, height))
    # смотрим что получилось
    img_resized.save('img_resized.jpg')

Image.rotate(angle, resample=Resampling.NEAREST, expand=0, center=None, translate=None, fillcolor=None):

Метод Image.rotate() возвращает повернутую копию этого изображения.

Метод возвращает копию этого изображения, повернутую на заданное число градусов angle против часовой стрелки вокруг его центра center.

Аргументы:

  • angle: угол поворота в градусах против часовой стрелки.
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BILINEAR или Resampling.BICUBIC. Если он опущен или если изображение имеет режим 1 или P, то для него устанавливается значение Resampling.NEAREST. Смотрите "Встроенные фильтры передискретизации".
  • expand: Необязательный флаг расширения. Если True, то выходное изображение расширяется, что делает его достаточно большим, чтобы вместить все повернутое изображение. Если значение False или опущено, то выходное изображение будет того же размера, что и входное. Обратите внимание, что флаг расширения предполагает вращение вокруг центра и отсутствие смещения translate.
  • center: Необязательный центр вращения (двойной кортеж). По умолчанию это центр изображения.
  • translate: Необязательный смещение после поворота (двойной кортеж).
  • fillcolor: Необязательный цвет для области за пределами повернутого изображения.

Код ниже поворачивает входное изображение на theta градусов против часовой стрелки:

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # сначала уменьшим скриншот
    (width, height) = (img.width // 2, img.height // 2)
    img_resized = img.resize((width, height))
    # угол поворота в градусах против часовой стрелки
    theta = 60
    img_rotated = img.rotate(angle=theta, expand=True)
    # смотрим что получилось
    img_rotated.save('img_rotated.jpg')

Image.save(fp, format=None, **params):

Метод Image.save() cохраняет изображение под заданным именем файла fp. Если формат format (JPEG, PNG, GIF, и т.д.) не указан, то используемый формат определяется по расширению имени файла, если это возможно.

Аргумент **params используется для предоставления дополнительных инструкций. Если метод не распознает дополнительный аргумент, он молча игнорируется. Доступные дополнительные аргументы описаны в материале "Чтение и запись основных форматов изображений" и "Обработка GIF изображений в Pillow".

Вместо имени файла можно использовать файловый объект. В этом случае необходимо всегда указывать формат format. Файловый объект должен реализовывать методы fp.seek, fp.tell и fp.write и открываться в двоичном режиме.

Возможные исключения:

  • ValueError: возникает, если формат вывода не удалось определить по имени файла. В этом случае необходимо передать аргумент format.
  • OSError: возникает, если файл не удалось записать. Возможно, файл был создан и может содержать частичные данные.

Image.seek(frame):

Метод Image.seek() выполняет поиск по номеру кадра frame в этом файле. Если номер кадра frame выходит за пределы конца последовательности кадров, то вызывается исключение EOFError. Когда файл с последовательностью кадров открыт, то Pillow автоматически ищет кадр 0.

Атрибут объекта изображения Image.n_frames указывает на количество доступных кадров.

Image.show(title=None):

Метод Image.show() открывает изображение в программе просмотрщике, заданной в OS по умолчанию. Внутри метод вызывает PIL.ImageShow.show(). Можно использовать PIL.ImageShow.register(), чтобы переопределить поведение по умолчанию.

Изображение сначала сохраняется во временный файл. По умолчанию он будет в формате PNG.

  • В Unix образ открывается с помощью утилиты display, eog или xv, в зависимости от того, какую из них можно найти.
  • В macOS изображение открывается с помощью собственного приложения Preview.
  • В Windows изображение открывается стандартной утилитой отображения PNG.

Аргумент title задает необязательный заголовок для использования в окне просмотрщика изображения, где это возможно.

Image.split():

Метод Image.split() делит изображение на отдельные каналы. Метод возвращает кортеж изображений отдельных полос исходного изображения.

Например, при разделении изображения RGB создаются три новых изображения, каждое из которых содержит копию одной из исходных полос (красной, зеленой, синей).

Если необходимо извлечь только один канал, то предпочтительнее использовать метод Image.getchannel(). Это будет более удобно и быстро.

Image.tell():

Метод Image.tell() возвращает номер текущего кадра.

Атрибут объекта изображения Image.n_frames указывает на количество доступных кадров. Номер кадров начинаются с 0.

Image.thumbnail(size, resample=Resampling.BICUBIC, reducing_gap=2.0):

Метод Image.thumbnail() создает из изображения миниатюру, изменяет объект изображения на месте и возвращает None.

Метод изменяет изображение так, чтобы оно содержало миниатюру самого себя, не превышающую заданный размер size. Он вычисляет подходящий размер эскиза с сохранением соотношения сторон, внутри вызывает метод Image.draft() для настройки программы чтения файлов (где применимо) и, наконец, изменяет размер изображения.

Обратите внимание, что этот метод изменяет объект изображения на месте. Если также нужно использовать изображение с полным разрешением, то примените этот метод к копии исходного изображения, например: img.copy().thumbnail((250, 250)).

Аргументы:

  • size: запрошенный размер в пикселях в виде кортежа: (width, height).
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BOX, Resampling.BILINEAR, Resampling.HAMMING, Resampling.BICUBIC или Resampling.LANCZOS. Если опущено, по умолчанию используется Resampling.BICUBIC. Смотрите "Встроенные фильтры передискретизации".
  • reducing_gap: значение оптимизации, которая изменяет размер изображения в два шага. Во-первых, изображение уменьшается в целое число раз с помощью метода Image.reduce() или Image.draft() для изображений JPEG. Во-вторых, размер изменяется с помощью обычной передискретизации. Передискретизация изменяет размер не меньше, чем reducing_gap. Значение reducing_gap может быть равно None (первый шаг не выполняется) или должно быть больше 1.0. Чем больше reducing_gap, тем ближе результат к справедливой повторной выборке. Чем меньше reducing_gap, тем быстрее изменяется размер. Если значение reducing_gap больше или равно 3.0, то результат в большинстве случаев неотличим от справедливой повторной выборки. Значение по умолчанию 2,0 (очень близко к справедливой передискретизации).

Пример создания миниатюр в формате JPEG:

import os, sys
from PIL import Image

size = (128, 128)
for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            with Image.open(infile) as im:
                im.thumbnail(size)
                im.save(outfile, "JPEG")
        except OSError:
            print("Не удается создать миниатюру для", infile)

Image.tobitmap(name='image'):

Метод Image.tobitmap() преобразовывает изображение в строку, содержащие растровое изображения X11.

Внимание! Этот метод работает только для изображений в режиме 1.

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

Если режим исходного изображения не равен 1, то возникает исключение ValueError

Image.tobytes(encoder_name='raw', *args):

Метод Image.tobytes() возвращает изображение как байтовый объект.

Предупреждение: Метод возвращает необработанные данные изображения из внутренней памяти. Для сжатых данных изображения (например, PNG, JPEG) нужно использовать метод Image.save() с аргументом io.BytesIO для данных в памяти.

Например:

from PIL import Image, ImageGrab
import time, io

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

byteImgIO = io.BytesIO()
with Image.open("test.jpg") as img:
    # сохраняем в памяти как io.BytesIO()
    img.save(byteImgIO, "PNG")
    # указатель файла в начало
    byteImgIO.seek(0)
    # читаем байты изображения в переменную
    byteImg = byteImgIO.read()

# открываем изображение как байты
img = Image.open(io.BytesIO(byteImg))
# смотрим что получилось
img.save('img_frombytes.jpg')
  • Аргумент encoder_name - используемый кодировщик. По умолчанию используется стандартный 'raw' кодировщик (список доступных кодировщиков языка C можно увидеть в разделе codecs массива функций в _imaging.c).
  • Аргумент args - дополнительные аргументы для кодировщика.

Пример использования метода Image.tobytes() совместно с функцией PIL.Image.frombytes():

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    size = img.size
    mode = img.mode
    # изображение в байтовый объект + меняем
    # местами каналы вместо 'RGB' => 'BGR'
    img_bytes = img.tobytes('raw', 'BGR')
    # + меняем местами красный и синий каналы
    # + перевернуть изображение
    # img_bytes = img.tobytes('raw', 'BGR', 0, -1)

# Создаем новое изображение с параметрами исходного 
img = Image.frombytes(mode, size, img_bytes, 'raw')
# Смотрим что получилось
img.save('img_frombytes.jpg')

Image.transform(size, method, data=None, resample=Resampling.NEAREST, fill=1, fillcolor=None):

Метод Image.transform() создает новое изображение заданного размера size и в том же режиме, что и исходное, и копирует данные в новое изображение с использованием заданного метода преобразования method.

Аргументы:

  • size: Выходной размер в пикселях, как 2-кортеж: (width, height).
  • data: Дополнительные данные к методу преобразования method.
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BILINEAR или Resampling.BICUBIC. Если изображение имеет режим 1 или P, то для него всегда устанавливается Resampling.NEAREST. Смотрите "Встроенные фильтры передискретизации".
  • fill: Если метод является объектом ImageTransformHandler, то это один из передаваемых ему аргументов. В противном случае он не используется.
  • fillcolor: Необязательный цвет заливки для области за пределами преобразования на выходном изображении.
  • method: Метод преобразования.

    Может принимать:

    • Transform.EXTENT - вырезать прямоугольную подобласть,
    • Transform.AFFINE - аффинное преобразование,
    • Transform.PERSPECTIVE - перспективное преобразование,
    • Transform.QUAD - преобразование четырехугольника в прямоугольник,
    • Transform.MESH - преобразование количества исходных четырехугольников за одну операцию.

    Также может быть объект ImageTransformHandler:

    class Example(Image.ImageTransformHandler):
      def transform(self, size, data, resample, fill=1):
          # Возвращаем результат
    

    Также может быть объект с методом method.getdata, который возвращает кортеж, содержащий новый метод и значения данных:

    class Example:
      def getdata(self):
          method = Image.Transform.EXTENT
          data = (0, 0, 100, 100)
          return method, data
    

Image.transpose(method):

Метод Image.transpose() транспонирует изображение. Возвращает перевернутую или повернутую копию этого изображения.

Аргумент method: может принимать значения:

  • Transpose.FLIP_LEFT_RIGHT,
  • Transpose.FLIP_TOP_BOTTOM,
  • Transpose.ROTATE_90,
  • Transpose.ROTATE_180,
  • Transpose.ROTATE_270,
  • Transpose.TRANSPOSE,
  • Transpose.TRANSVERSE.

Код ниже переворачивает входное изображение с помощью метода Transpose.FLIP_LEFT_RIGHT.

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # Отображает изображение слева направо
    img_flipped = img.transpose(method=Image.Transpose.FLIP_LEFT_RIGHT)
    img_flipped.save('img_flipped.png')

Image.verify():

Метод Image.verify() проверяет содержимое файла.

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

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

Image.load():

Метод Image.load() выделяет память для изображения и загружает данные. В обычных случаях не нужно вызывать этот метод, так как класс Image автоматически загружает открытое изображение при первом доступе к нему.

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

Дополнительно смотрите функцию PIL.Image.open().

Image.close():

Метод Image.close() закрывает указатель файла, если это возможно.

Эта операция уничтожит ядро ​​образа и освобождает его память. После этого данные изображения будут непригодны для использования.

Метод Image.close() необходим для закрытия изображений, которые имеют несколько кадров или файл которых не был прочитан и закрыт методом Image.load().

Дополнительно смотрите функцию PIL.Image.open().