Using Pillow (which works with Python 3.X as well as Python 2.7+), you can do the following:
from PIL import Image
im = Image.open('image.jpg', 'r')
width, height = im.size
pixel_values = list(im.getdata())
Now you have all pixel values. If it is RGB or another mode can be read by im.mode
. Then you can get pixel (x, y)
by:
pixel_values[width*y+x]
Alternatively, you can use Numpy and reshape the array:
>>> pixel_values = numpy.array(pixel_values).reshape((width, height, 3))
>>> x, y = 0, 1
>>> pixel_values[x][y]
[ 18 18 12]
A complete, simple to use solution is
# Third party modules
import numpy
from PIL import Image
def get_image(image_path):
"""Get a numpy array of an image so that one can access values[x][y]."""
image = Image.open(image_path, "r")
width, height = image.size
pixel_values = list(image.getdata())
if image.mode == "RGB":
channels = 3
elif image.mode == "L":
channels = 1
else:
print("Unknown mode: %s" % image.mode)
return None
pixel_values = numpy.array(pixel_values).reshape((width, height, channels))
return pixel_values
image = get_image("gradient.png")
print(image[0])
print(image.shape)
Smoke testing the code
You might be uncertain about the order of width / height / channel. For this reason I’ve created this gradient:
The image has a width of 100px and a height of 26px. It has a color gradient going from #ffaa00
(yellow) to #ffffff
(white). The output is:
[[255 172 5]
[255 172 5]
[255 172 5]
[255 171 5]
[255 172 5]
[255 172 5]
[255 171 5]
[255 171 5]
[255 171 5]
[255 172 5]
[255 172 5]
[255 171 5]
[255 171 5]
[255 172 5]
[255 172 5]
[255 172 5]
[255 171 5]
[255 172 5]
[255 172 5]
[255 171 5]
[255 171 5]
[255 172 4]
[255 172 5]
[255 171 5]
[255 171 5]
[255 172 5]]
(100, 26, 3)
Things to note:
- The shape is (width, height, channels)
- The
image[0]
, hence the first row, has 26 triples of the same color
В прошлой статье мы узнали как установить библиотеку PIL в Python и начать уже с ней работать. В этой статье мы продолжаем изучение библиотеки PIL. Начиная с версией 1.1.6 метод load() возвращает объект, с помощью которого можно получить доступ к отдельным пикселям изображения. Указав два значения внутри квадратных скобок, можно получить или задать цвет пикселя.
>>> img = Image.open("foto.jpg")
>>> obj = img.load()
>>> obj[25, 45] # Получаем цвет пикселя
(122, 86, 62)
>>> obj[25, 45] = (255, 0, 0) # Задаем цвет пикселя (красный)
Для доступа к отдельному пикселю вместо метода load() можно использовать методы getpixel() и putpixel(). Метод getpixel(<Координаты>) позволяет получить цвет указанного пикселя, а метод putpixel(<Координаты>, <Цвет>) изменяет цвет пикселя. Координаты пикселя указываются в виде кортежа из двух элементов. Необходимо заметить, что эти методы работают медленнее метода load(). Пример использования метода getpixel() и putpixel() приведен ниже.
Использование метода getpixel() и putpixel()
>>> img = Image.open("foto.jpg")
>>> img.getpixel((25, 45)) # Получаем цвет пикселя
(122, 86, 62)
>>> img.putpixel((25, 45), (255, 0, 0)) # Изменяем цвет пикселя
>>> img.getpixel((25, 45)) # Получаем цвет пикселя
(255, 0, 0)
>>> img.show() # Просматриваем изображение
В этом примере для просмотра изображения мы воспользовались методом show(). Метод show() создает временный файл в формате BMP и запускает программу для просмотра изображения, используемую в операционной системе по умолчанию. Например, на моем компьютере запускается программа ACDSee. Для сохранения изображения в файл предназначен метод save().
В первом параметре указывается абсолютный или относительный путь. Вместо пути можно передать файловый объект, открытый в бинарном режиме. Сохраним изображение в форматах JPEG и BMP разными способами.
Сохраняем изображение в Python
>>> img.save("tmp.jpg") # В формате JPEG
>>> img.save("tmp.bmp", "BMP") # В формате BMP
>>> f = open("tmp2.bmp", "wb")
>>> img.save(f, "BMP") # Передаем файловый объект
>>> f.close()
Обратите внимание на то, что мы открыли файл в формате JPEG, а сохранили его в формате BMP. Таким образом, можно открывать изображения в одном формате и конвертировать его в другой формат. Если сохранить изображение не удалось, возбуждается исключение IOError. Если параметр <Формат> не указан, то формат изображения определяется по расширению файла.
В параметре <Обции> можно указать дополнительный характеристики изображения. Поддерживаемый опции зависят от формата изображения. Например, по умолчанию изображения в формате JPEG сохраняются с качеством 75. С помощью опции quality можно указать другое значение в диапазоне от 1 до 100.
>>> img.save("tmp3.jpg", "JPEG", quality=100) # Указание качества
За дополнительной информации по опциям обращайтесь к документации. Так же для более подробной инструкции игры в покер можете прочитать poker правила и повысить свои навыки в этой игре. Удивите своих знакомых во время игры в покер, продемонстрировав им свой профессионализм игры.
To get the RGB values from a pixel of the screen with coordinates (x,y) in Python, I do:
import PIL.ImageGrab
rgb = PIL.ImageGrab.grab().load()[x,y]
It was working as I expected until I did:
rgb = PIL.ImageGrab.grab().load()[1673,0]
Instead of the RGB values of the pixel, I received:
IndexError: image index out of range
I don’t understand why because my screen has 1920×1080 resolution.
How can I fix this?
Объект 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
.
- В 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()
.
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
PIL is the Python Imaging Library which provides the python interpreter with image editing capabilities. The PixelAccess class provides read and write access to PIL.Image data at a pixel level.
Accessing individual pixels is fairly slow. If you are looping over all of the pixels in an image, there is likely a faster way using other parts of the Pillow API.
getpixel() Returns the pixel at x, y. The pixel is returned as a single
Syntax: getpixel(self, xy)
Parameters:
xy :The pixel coordinate, given as (x, y).
Returns: a pixel value for single band images, a tuple of pixel values for multiband images.
Image Used:
Python3
from
PIL
import
Image
im
=
Image.
open
(r
"C:UsersSystem-PcDesktopleave.jpg"
)
px
=
im.load()
print
(px[
4
,
4
])
px[
4
,
4
]
=
(
0
,
0
,
0
)
print
(px[
4
,
4
])
coordinate
=
x, y
=
150
,
59
print
(im.getpixel(coordinate));
Output:
(130, 105, 49) (0, 0, 0) (75, 19, 0)
Another example:Here we change the coordinate value.
Image Used
Python3
from
PIL
import
Image
im
=
Image.
open
(r
"C:UsersSystem-PcDesktopleave.jpg"
)
px
=
im.load()
print
(px[
4
,
4
])
px[
4
,
4
]
=
(
0
,
0
,
0
)
print
(px[
4
,
4
])
coordinate
=
x, y
=
180
,
79
print
(im.getpixel(coordinate));
Output:
(130, 105, 49) (0, 0, 0) (22, 168, 25)
Last Updated :
19 May, 2021
Like Article
Save Article