Объект Image
представляет экземпляр открытого/созданного изображения. Для создания объектов Image
используются соответствующие фабричные функции:
PIL.Image.open()
- открывает изображение;PIL.Image.new()
- создает новое изображение;PIL.Image.frombytes()
- создает новое изображение из массива байтов.Image
модуля Pillow.Image
;Image.filename
имя исходного файла;Image.format
формат исходного файла;Image.mode
режим изображения;Image.size
размер изображения в пикселях;Image.width
ширина изображения;Image.height
высота изображения;Image.palette
цветовая палитра;Image.info
данные, связанные с изображением;Image.is_animated
изображение имеет более одного кадра;Image.n_frames
количество кадров;Image
;Image.alpha_composite()
накладывает изображение;Image.apply_transparency()
применяет прозрачность к палитре;Image.convert()
переводит пиксели через палитру;Image.copy()
копирует это изображение;Image.crop()
обрезает входное изображение;Image.draft()
загружает изображение с указанными параметрами;Image.effect_spread()
распределяет пиксели в изображении;Image.entropy()
возвращает энтропию для изображения;Image.filter()
применяет фильтр к изображению;Image.frombytes()
загружает в изображение пиксельные данные из bytes
;Image.getbands()
возвращает название каждого канала;Image.getbbox()
возвращает рамку ненулевых областей изображения;Image.getchannel()
возвращает указанный канал изображения;Image.getcolors()
возвращает список цветов, используемых в изображении;Image.getdata()
возвращает содержимое изображения в последовательности;Image.getexif()
возвращает словарь EXIF
тегов;Image.getextrema()
max и min значения пикселей для каждого канала;Image.getpalette()
возвращает палитру изображения;Image.getpixel()
значение цвета пикселя в заданной позиции;Image.getprojection()
возвращает последовательности с ненулевыми пикселями по оси X и Y ;Image.histogram()
возвращает список с количеством пикселей;Image.paste()
вставляет другое изображение;Image.point()
применяет пользовательскую функцию к каждому пикселю;Image.putalpha()
добавляет или заменяет альфа-канал;Image.putdata()
копирует пиксельные данные из сглаженной последовательности в изображение;Image.putpalette()
прикрепляет палитру к изображению;Image.putpixel()
изменяет значение пикселя в заданном положении;Image.quantize()
преобразует изображение в режим P
с указанным количеством цветов;Image.reduce()
копия изображения, уменьшенная в несколько раз;Image.remap_palette()
измененным порядком палитры;Image.resize()
изменяет размер изображения;Image.rotate()
поворачивает изображение;Image.save()
cохраняет изображение;Image.seek()
поиск по номеру кадра;Image.show()
открывает изображение в программе просмотрщике;Image.split()
делит изображение на отдельные каналы;Image.tell()
возвращает номер текущего кадра;Image.thumbnail()
создает из изображения миниатюру;Image.tobitmap()
преобразовывает изображение в растровое изображения X11;Image.tobytes()
возвращает изображение как байтовый объект;Image.transform()
трансформирует изображение определенным методом;Image.transpose()
переворачивает или поворачивает изображения;Image.verify()
пытается определить, поврежден ли файл;Image.load()
выделяет память и загружает данные изображения;Image.close()
закрывает указатель файла изображения.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
: Желаемое количество цветов, <= 256palette
: Квантовать в палитру заданных 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
.
display
, eog
или xv
, в зависимости от того, какую из них можно найти.Preview
.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()
.