Какого цвета больше на картинке python pil
Перейти к содержимому

Какого цвета больше на картинке python pil

  • автор:

Изменение цвета пикселя с помощью Pillow

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

Ника
Новичок

Пользователь

Окт 17, 2020 26 0 1

#Открыть изображение, выделить три компоненты цвета для всего изображения. Попиксельно обработать изображение. # Если red+gren+blue для текущего пикселя больше, чем для всего изображения, изменить цвет пикселя на красный. # Помогите, пожалуйста, разобраться в чем проблема, и как её исправить. #выдаёт ошибку # File "C:/Users/Lenovo/PycharmProjects/untitled2/иии.py", line 16, in r=pix[x,y][0] TypeError: 'JpegImageFile' object is not subscriptable import PIL from PIL import Image from PIL import ImageDraw img=Image.open('image.jpg') pix=Image.open('image.jpg') w=img.size[0]#ширина h=img.size[1]#высота draw=ImageDraw.Draw(img) for x in range (w): for y in range(h): r=pix[x,y][0] g=pix[x,y][1] b=pix[x,y][2] for i in range(w): for j in range(h): if (pix[i,j][0] + pix[i,j][1] + pix[i,j][2] ) > (r+g+b): draw.point([i,j], (255,0,0))

Последнее редактирование: Дек 21, 2020

§6.5. Картинки

Рассмотрим ещё один интересный класс задач — работу с картинками. Вы уже знаете, что картинки — это бинарные файлы, поэтому просто так их не поредактируешь и не «прочитаешь». На самом деле, именно этого позволяет достичь библиотека Pillow — практически Photoshop для программистов. С ней мы и будем знакомиться. Перед началом, установите её: pip3 install pillow .

Базовые операции

Изображение, на котором мы будем тренироваться. Вы можете помнить его из параграфа про стеганографию в звуке.

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

Внутри Python библиотека Pillow называется PIL . Это связано с историей библиотеки — она является улучшенной версией оригинальной библиотеки PIL.

In [1]: from PIL import Image

Теперь загрузим картинку, используя функцию Image.open() :

In [2]: img = Image.open("lena.png")

В img будет сохранён объект, через который загруженное изображение можно менять, сохранять в другой файл и прочее. Например, вы сразу можете посмотреть на него, используя метод .show() :

In [3]: img.show()

Откроется окошко с картинкой. Таким образом вы всегда можете посмотреть, что у вас получилось.

Давайте попробуем выполнить несколько простых операций. Преобразуем картинку в оттенки серого:

In [4]: img.convert("L").show()

Результат отобразится на экране.

Вы можете сразу показать результат на экране, вызвав несколько методов подряд. В дальнейшем мы не будем писать .show() в примерах — вы всегда можете сделать это сами.

Мы воспользовались методом .convert() , который принимает в качестве аргумента режим работы, и возвращает новое, преобразованное изображение. «L» обозначает «изображение в оттенках серого». Другой интересный режим — «1» , который преобразует картинку в чёрно-белую, но с применением специального алгоритма преобразования — так, что на глаз не сразу заметишь, что в ней используется всего два цвета.

Теперь поработаем с размерами картинки. Получить размеры можно, используя атрибут .size .

In [5]: a.size Out [5]: (220, 220)

Размер хранится парой — это ещё один тип данных в Python, который позволяет держать вместе два любых значения. В данном случае первый элемент пары — это размер картинки в пикселях по горизонтали, а второй — по вертикали. Значения из пары можно получить, распаковав её в две отдельные переменные:

In [6]: x, y = a.size In [7]: x Out [7]: 220 In [8]: y Out [8]: 220

Теперь давайте увеличим размер исходной картинки, скажем, в два раза. Для этого мы можем использовать метод .resize() , используя только что полученные значения исходного размера. Для этого нужно будет также создать новую пару:

In [9]: bigger_size = (2 * x, 2 * y) In [10]: bigger_size Out [10]: (440, 440) In [11]: bigger_img = img.resize(bigger_size)

Попробуйте теперь самостоятельно сконвертировать изображение в чёрно-белый вид, вызвав .convert(«1») , а затем увеличить его и вывести на экран. Вы увидите, каким образом создаётся иллюзия разной яркости.

Как мы видим, некоторые функции и методы в Python также принимают пары как аргументы. Полученную картинку мы также можем посмотреть с помощью .show() . В Pillow можно найти функции для обработки изображений на все случаи жизни — обратитесь к документации объекта Image . Давайте изучим ещё один полезный метод, .save() , который используется для сохранения результата вашей работы в другой файл. Формат сохраняемого изображения будет определяться расширением, которое вы используете. Например, давайте сохраним картинку в формате JPEG:

In [12]: img.save("new_lena.jpg")

В директории, где вы открыли интерпретатор, появится новый файл, который вы можете открыть обычным системным просмотрщиком.

Собираем коллажи

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

In [13]: new_img = Image.new("RGB", (2 * img.width, img.height))

Полный список режимов изображения можно найти в документации. Однако нам в параграфе пригодятся только RGB , L и 1 .

Здесь мы воспользовались функцией Image.new() , которая принимает два аргумента: режим изображения и его размер в виде пары. Режим здесь совпадает с аргументом, который мы раньше передавали в .convert() — «RGB» означает «цветное изображение» (соответственно, можно было бы передать «L» , и получить изображение в оттенках серого). Размеры исходного изображения мы получаем из атрибутов .width и .height ; в них содержится тот же размер, что и в .size , но раздельно.

Что мы можем сделать с полученным изображением? Одна из часто используемых операций — вставка, когда мы вставляем исходное изображение в какое-либо место конечного, — опять же, прямо как в графическом редакторе. Чтобы чуть разнообразить результат, воспользуемся также методом .transpose() , который позволяет поворачивать изображение или отражать его по вертикали и горизонтали. Для начала давайте получим отражённую по горизонтали фотографию Лены (так зовут модель на фотографии):

In [14]: flipped_img = img.transpose(Image.FLIP_LEFT_RIGHT)

Как аргумент .transpose() принимает одну из констант, определённую в модуле Image . Это — заранее заданные значения, обозначающие ту или иную операцию. Кроме Image.FLIP_LEFT_RIGHT , которое обозначает нужную нам операцию, определено например Image.ROTATE_90 , обозначающее «выполнить поворот на 90 градусов по часовой стрелке». Полный список поддерживаемых операций можно посмотреть в документации.

Теперь давайте склеим два изображения — исходное и отражённое — по горизонтали, вставив их в новое изображение. Здесь пригодится метод .paste() , который вызывается для изображения-получателя. Ему передаётся два аргумента: вставляемое изображение и координаты вставки.

Так устроена координатная сетка в Pillow. В разных библиотеках для работы с графикой координаты устроены по-разному.

Чтобы осуществить задуманное, первое изображение следует вставить по координатам (0, 0) , а второе — в (img.width, 0) :

In [15]: new_img.paste(img, (0, 0)) In [16]: new_img.paste(flipped_img, (img.width, 0)) In [17]: new_img.show()

В результате выйдет широкое изображение, в которое вставлены два предыдущих.

Рисуем по пикселям

Наконец, в Pillow есть модуль для рисования двухмерных изображений, который называется ImageDraw . Он позволяет рисовать точки, линии, круги, добавлять надписи — в общем, всё, что может пригодиться для простых задач. Давайте попробуем создать несколько рисунков. Для начала загрузим библиотеку и созданим контекст — объект, позволяющий проводить операции над изображением. Также создадим новое пустое изображение-холст (которое по умолчанию будет залито чёрным цветом):

In [18]: from PIL import ImageDraw In [19]: result_img = Image.new("RGB", (200, 200)) In [20]: ctx = ImageDraw.Draw(result_img)

Все операции рисования теперь доступны через объект ctx . В любой момент можно посмотреть текущее изображение, выполнив result_img.show() .

Начнём с классической задачи — нарисуем квадрат. Мы будем использовать для этого метод .line() , позволяющий рисовать ломаные линии. Кроме координат точек, на которых надо построить ломаную, этот метод принимает аргумент fill , определяющий цвет линии. Для изображений в формате RGB цвет задаётся интенсивностью трёх цветовых каналов — красного, зелёного и синего. Про это подробнее описывалось в параграфе о стеганографии в изображениях. В Pillow это значение описывается тройкой, например (255, 255, 0) обозначает жёлтый цвет. Давайте нарисуем жёлтый квадрат стороной 100 пикселей в центре изображения:

In [21]: ctx.line([(50, 50), (150, 50), (150, 150), (50, 150), (50, 50)], fill=(255, 255, 0))

Это действие можно также выполнить проще, используя метод .rectangle() . Он принимает всего две точки — две стороны прямоугольника, Этот метод также позволяет закрасить внутренности прямоугольника, используя параметр fill , и сделать обводку отдельным цветом через параметр outline :

In [22]: ctx.rectangle([(75, 75), (125, 125)], fill=(0, 255, 255), outline=(255, 255, 0))

Последний и самый универсальный метод, который мы рассмотрим — .putpixel() . Этот метод объекта изображения позволяет закрашивать заданные пиксели изображения. Давайте, используя его, создадим изображение полностью из случайных пикселей. Такой код удобнее будет писать в отдельном файле — создадим новый файл в текстовом редакторе. Итак, применим здесь наши знания из предыдущих глав, а также изучим новый модуль random . Этот модуль позволяет генерировать случайные числа, и мы будем использовать его для выбора цвета каждого пикселя. Для этой задачи подойдёт функция random.randrange() . Она принимает число stop , и возвращает такое случайное целое число n , что 0

from PIL import Image import random img = Image.new("RGB", (200, 200)) for x in range(img.width): for y in range(img.height): r = random.randrange(256) g = random.randrange(256) b = random.randrange(256) img.putpixel((x, y), (r, g, b)) img.save("random.png")

Попробуйте исполнить его на своём компьютере.

Пример результата работы программы.

Выводы

  1. В Python есть удобное средство работы с изображениями — библиотека Pillow.
  2. В библиотеке есть много методов по преобразованию изображений — перевода в другую цветовую схему. изменения размера, сохранения в других форматах и многое другое. Эти функции содержатся в модуле PIL.Image .
  3. Мы можем создавать изображения сами, собирая их из комбинаций существующих. Используя модуль PIL.ImageDraw , можно рисовать геометрические фигуры и даже надписи.
  4. Метод .putpixel() позволяет нам закрашивать каждый пиксель изображения по отдельности.

PIL на Python от простого к сложному

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

Для примеров обработки будет использоваться изображение с различным наборов цветов:

image

Для старта нам потребуется два модуля библиотеки:

from PIL import Image, ImageDraw 

Настроим инструменты для комфортной дальнейшей работы:

image = Image.open('test.jpg') # Открываем изображение draw = ImageDraw.Draw(image) # Создаем инструмент для рисования width = image.size[0] # Определяем ширину height = image.size[1] # Определяем высоту pix = image.load() # Выгружаем значения пикселей

Приступим

Обрабатывать изображения будем в формате RGB. Также PIL поддерживает работу с форматами 1, L, P, RGB, RGBA, CMYK, YCbCr, LAB, HSV, I, F.

Значения пикселя в изображении задаются в формате: (x,y),(red, green, blue), где x,y — координаты, а числовые значения RGB находятся в диапазоне от 0 до 255. То есть работаем с 8-битным изображением.

Оттенок серого

Серый оттенок появляется в случае равенства всех палитр цветов, поэтому нам нужно получить среднее арифметическое значение во всех трёх пунктах:

 for x in range(width): for y in range(height): r = pix[x, y][0] #узнаём значение красного цвета пикселя g = pix[x, y][1] #зелёного b = pix[x, y][2] #синего sr = (r + g + b) // 3 #среднее значение draw.point((x, y), (sr, sr, sr)) #рисуем пиксель image.save("result.jpg", "JPEG") #не забываем сохранить изображение 

image

Небольшой нюанс

Человеческий глаз разный спектр цветов воспринимает по-разному. Точной формулы вам никто не даст, так как восприятие цветов так или иначе у всех разное, но если вам интересно, подробнее можно прочитать тут и тут.

Инверсия

Инверсия получается путём вычета из 255 текущего цвета:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] draw.point((x, y), (255 - r, 255 - g, 255 - b))

image

Инверсия оттенка серого

Совмещая два предыдущих алгоритма можно написать следующий код:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] sr = (r + g + b) // 3 draw.point((x, y), (255 - sr, 255 - sr, 255 - sr))

image

Выборочная инверсия оттенка серого

Для этого алгоритма нужно определить пороговое значение, которое я возьму за 100:

for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] if (r+g+b)>100: #если сумма значений больше 100 , то используем инверисю sr = (r + g + b) // 3 draw.point((x, y), (255-sr, 255-sr, 255-sr)) else: #иначе обычный оттенок серого sr = (r + g + b) // 3 draw.point((x, y), (sr, sr, sr))

image

Заключение

В следующих статьях я хотел бы рассказать о том, как более локально подходить к фильтрации изображения, путём разделения его на области, а также показать интересные возможности DFS в алгоритмах обработки изображения

  • Python
  • Обработка изображений

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

Объект 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.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.n_frames возвращает количество кадров в анимированном изображении.

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

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

    Методы объекта 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) для границ исходного прямоугольника
    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 : Желаемое количество цветов,
    • palette : Квантовать в палитру заданных PIL.Image.Image .
    • dither : Метод сглаживания, используемый при преобразовании из режима RGB в P или из RGB или L в 1 . Доступные методы: Dither.NONE или Dither.FLOYDSTEINBERG (по умолчанию).
    • method : Quantize.MEDIANCUT (срединный разрез), Quantize.MAXCOVERAGE (максимальный охват), Quantize.FASTOCTREE (быстрое октодерево), Quantize.LIBIMAGEQUANT (libimagequant; проверить поддержку с помощью PIL.features.check_feature() с аргументом feature=»libimagequant» ). По умолчанию будет использоваться Quantize.MEDIANCUT . Исключение составляют изображения RGBA . Quantize.MEDIANCUT и Quantize.MAXCOVERAGE не поддерживают изображения RGBA , вместо них по умолчанию используется Quantize.FASTOCTREE .
    Image.reduce(factor, box=None) :

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

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

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

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

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

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

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

    from PIL import Image, ImageGrab import time # 2 секунды на выбор # окна для скриншота time.sleep(2) # создание скриншота выбранного окна img = ImageGrab.grab() # сохраним скриншот img.save("test.jpg") with Image.open("test.jpg") as img: # целевая ширина и высота изображения (width, height) = (img.width // 2, img.height // 2) img_resized = img.resize((width, height)) # смотрим что получилось img_resized.save('img_resized.jpg') 
    Image.rotate(angle, resample=Resampling.NEAREST, expand=0, center=None, translate=None, fillcolor=None) :

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

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

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

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

    from PIL import Image, ImageGrab import time # 2 секунды на выбор # окна для скриншота time.sleep(2) # создание скриншота выбранного окна img = ImageGrab.grab() # сохраним скриншот img.save("test.jpg") with Image.open("test.jpg") as img: # сначала уменьшим скриншот (width, height) = (img.width // 2, img.height // 2) img_resized = img.resize((width, height)) # угол поворота в градусах против часовой стрелки theta = 60 img_rotated = img.rotate(angle=theta, expand=True) # смотрим что получилось img_rotated.save('img_rotated.jpg') 
    Image.save(fp, format=None, **params) :

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

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

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

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

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

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

    Image.show(title=None) :

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

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

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

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

    Image.split() :

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

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

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

    Image.tell() :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Например:

    from PIL import Image, ImageGrab import time, io # 2 секунды на выбор # окна для скриншота time.sleep(2) # создание скриншота выбранного окна img = ImageGrab.grab() # сохраним скриншот img.save("test.jpg") byteImgIO = io.BytesIO() with Image.open("test.jpg") as img: # сохраняем в памяти как io.BytesIO() img.save(byteImgIO, "PNG") # указатель файла в начало byteImgIO.seek(0) # читаем байты изображения в переменную byteImg = byteImgIO.read() # открываем изображение как байты img = Image.open(io.BytesIO(byteImg)) # смотрим что получилось img.save('img_frombytes.jpg') 
    • Аргумент encoder_name — используемый кодировщик. По умолчанию используется стандартный ‘raw’ кодировщик (список доступных кодировщиков языка C можно увидеть в разделе codecs массива функций в _imaging.c ).
    • Аргумент args — дополнительные аргументы для кодировщика.

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

    from PIL import Image, ImageGrab import time # 2 секунды на выбор # окна для скриншота time.sleep(2) # создание скриншота выбранного окна img = ImageGrab.grab() # сохраним скриншот img.save("test.jpg") with Image.open("test.jpg") as img: size = img.size mode = img.mode # изображение в байтовый объект + меняем # местами каналы вместо 'RGB' => 'BGR' img_bytes = img.tobytes('raw', 'BGR') # + меняем местами красный и синий каналы # + перевернуть изображение # img_bytes = img.tobytes('raw', 'BGR', 0, -1) # Создаем новое изображение с параметрами исходного img = Image.frombytes(mode, size, img_bytes, 'raw') # Смотрим что получилось img.save('img_frombytes.jpg') 
    Image.transform(size, method, data=None, resample=Resampling.NEAREST, fill=1, fillcolor=None) :

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

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

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

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

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

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

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

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

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

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

      from PIL import Image, ImageGrab import time # 2 секунды на выбор # окна для скриншота time.sleep(2) # создание скриншота выбранного окна img = ImageGrab.grab() # сохраним скриншот img.save("test.jpg") with Image.open("test.jpg") as img: # Отображает изображение слева направо img_flipped = img.transpose(method=Image.Transpose.FLIP_LEFT_RIGHT) img_flipped.save('img_flipped.png') 
      Image.verify() :

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

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

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

      Image.load() :

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

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

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

      Image.close() :

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

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

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

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

      • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
      • Функция Image.open() модуля Pillow
      • Функция Image.new() модуля Pillow
      • Функция Image.frombytes() модуля Pillow
      • Функция Image.frombuffer() модуля Pillow
      • Функция Image.fromarray() модуля Pillow
      • Создание скриншота с использованием Pillow
      • Объект Image модуля Pillow
      • Обработка GIF изображений в Pillow
      • Параметры для JPG, ICO и WebP модуля Pillow
      • Извлечение EXIF-тегов модулем Pillow
      • Встроенные фильтры улучшения модуля Pillow
      • Фильтры передискретизации модуля Pillow
      • Подмодуль ImageDraw модуля Pillow
      • Функция Image.alpha_composite() модуля Pillow
      • Функция Image.blend() модуля Pillow
      • Функция Image.composite() модуля Pillow
      • Функция Image.merge() модуля Pillow
      • Функция Image.eval() модуля Pillow
      • Регулировка яркости, контрастности, резкости и насыщенности: Pillow
      • Автоматическая регулировка контрастности, Pillow
      • Тонирование черно-белого фото модулем Pillow
      • Масштабирование изображений с модулем Pillow
      • Добавить/обрезать рамку изображения, модуль Pillow
      • Перевернуть/отразить изображение, модуль Pillow
      • Обесцвечивание/инверсия изображения, модуль Pillow
      • Операции с каналами изображений, модуль Pillow

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *