Перейти к содержимому

Как вывести картинку в python

  • автор:

Добавляем картинки и пишем тамагочи

На самом деле все просто, достаточно просто добавить Label и задать для него фоновое изображение. Картинку можно утащить отсюда. Вот так.

from tkinter import * window = Tk() # открываем картинку luntik.gif, она лежит в одной папке с программой и кладем в переменную luntik_image luntik_image = PhotoImage(file='luntik.gif') # создаем текстовое поле и указываем, что туда нужно поместить картинку из переменной luntik_image Label(window, image=luntik_image).pack() mainloop()

Но есть один нюанс: tkinter не умеет работать с большинством популярных форматов графики, из коробки доступен только gif. Однако эта проблема легко решается установкой стороннего модуля Pillow !

Установка сторонних модулей

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

Для установки модулей необходимо использовать программу pip, которая устанавливается на ваш компьютер вместе в питоном. Единственный нюанс, pip работает только через командную строку. Для ее вызова необходимо нажать Win+R , а затем в окне «Выполнить» ввести cmd и нажать Enter.

Для Mac вызов командной строки устроен аналогично, только вместо Win+R нужно использоватьл комбинацию Command + пробел , а затем в поле Spotlight ввести terminal.

Чтобы вызвать установщик пакетов, достаточно написать в консоли pip (или pip3 , если не работает команда pip ) и нажать Enter . Вы увидите что то похоже на.

Если команда pip не найдена, скорее всего при установке python вы не активировали галочку «Add to PATH».

Есть два варианта решения проблемы: переустановить python или добавить путь к питону в PATH вручную.

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

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

Как видишь, уже есть. Более того, в информации указана версия, автор и прочая информация. Если же модуль не установлен или при вводе названия допущена ошибка, то информация не будет выведена.

Наличие больших и маленьких букв в названии модуля роли не играет. Даже если ввести pip show PiLloW , pip все равно вывел бы информацию о нем. Если какой-то модуль нам больше не нужен или возникла какая-то неполадка в его работе, то мы можем его удалить, введя pip uninstall .

Ничего сложного! А если я хочу обратно его установить, то мне нужно ввести pip install .

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

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

Поиск подходящих вам модулей можно осуществлять не только на в поисковике (Google, Yandex и т.д.), в качестве базы для поиска можно использовать Pypi, LDF или GitHub. Pypi содержит в себе поисковик, который позволяет отыскать не только модули, но и любые их модификации. После их можно установить либо по называнию pip install , либо скачать файл *.whl , который содержит ваш модуль.

Установка из файла аналогичена установке по названию. Сначала вам нужно вам нужно переместится в папку, где хранится файл *.whl , используя команду cd , а затем применить команду pip install . На LDF хранятся модули в формате *.whl , некоторые из которых уже нельзя найти на Pypi.

Также необходимый модуль можно установить из исходников с помощью команды pip install https://github.com/// . Так например, мы можем поставить pillow вот такой командой: pip install https://github.com/python-pillow/Pillow/master.zip .

Используем картинки любых форматов и меняем их размер

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

Сперва библиотеку нужно установить. Для этого в консоли нужно выполнить команду:

pip3 install pillow

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

pip3 install --user pillow

После этого можно открывать файлы в любых форматах.

from tkinter import * # импортируем функционал для работы с картинками из pillow, которую мы только что установили from PIL import Image, ImageTk window = Tk() # открываем изображение любого формата и кладем его в переменную image_file image_file = Image.open("brothers.jpeg") # "готовим" изображение к размещению в окне и кладем в переменную vp_image vp_image = ImageTk.PhotoImage(image_file) # добавляем после и устанавливаем картинку в качестве фона Label(window, image=vp_image).pack() mainloop()

В качестве бонуса — изменить размер картинки теперь можно прямо в коде.

# открываем изображение любого формата и кладем его в переменную image_file image_file = Image.open("brothers.jpeg") # меняем размер картинки на 300 на 300 пикселей image_file = image_file.resize((300, 300), Image.LANCZOS) # "готовим" изображение к размещению в окне и кладем в переменную vp_image vp_image = ImageTk.PhotoImage(image_file)

Используем таймер, цвет и размер шрифта

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

Для этого можно попросить tkinter вызвать нашу функцию не после нажатия на кнопку, а просто через несколько миллисекунд или секунд. Делается это с помощью метода after() . В примере ниже попробуем обновлять случайное число раз в секунду.

import random from tkinter import * # функция, которая будет обновлять число на экране def update_number(): # генерируем и записываем число в текстовое поле label.config(text=random.randint(1, 100)) # просим window вызвать функцию update_number еще раз через секунду (1000 мс) window.after(1000, update_number) window = Tk() # создаем текстовое поле # дополнительно указываем шрифт (семейство - Comic Sans MS, 25 - размер) и цвет (fg - foreground color) # padx и pady (padding x, padding y) в параметрах pack - это отступы от справа/слева и сверху/снизу label = Label(window, font=("Comic Sans MS", 25), fg="green") label.pack(padx=50, pady=50) # просим window вызвать функцию update_number через секунду (1000 мс) window.after(1000, update_number) mainloop()

Программа выше будет раз в секунду менять число на экране.

Анимация

А что если совместить вывод изображений и таймер? Получится анимация!

Единственное, что нам потребуется для этого — научится изменять уже заданную картинку с помощью .configure() .

Делается это так:

img1 = ImageTk.PhotoImage(Image.open("face1.jpg")) img2 = ImageTk.PhotoImage(Image.open("face2.jpg")) image_label = Label(window, image=img1) image_label.pack() # когда хотим поменять картинку - вызываем configure image_label.configure(image=img2)

Ниже пример простой анимации — лицо меняется каждые 800 мс.

from tkinter import * from PIL import Image, ImageTk import psutil # функция, которая будет двигать картинки def next_img(): global pic_number # если номер был 0 - он станет 1, а если был 1 - станет 0 pic_number = (pic_number + 1) % 2 # в зависимости от номера, выбираем нужную картинку if pic_number == 0: # и устанавливаем ее в image_label image_label.configure(image=img1) if pic_number == 1: image_label.configure(image=img2) # через долю секунды - вызываем смену картинки снова window.after(800, next_img) window = Tk() window.title("FaceIt") # открываем две картинки и изменяем их размер до 300 пикселей img1 = ImageTk.PhotoImage(Image.open("face1.jpg").resize((300, 300), Image.ANTIALIAS)) img2 = ImageTk.PhotoImage(Image.open("face2.jpg").resize((300, 300), Image.ANTIALIAS)) # тут будем хранить номер картинки, которую показываем сейчас pic_number = 0 # чтобы иметь возможность менять картинку, сохраняем поле в переменную image_label image_label = Label(window, image=img1) image_label.pack() # спустя долю секунды просим поменять картинку - запустить функцию next_img window.after(800, next_img) mainloop()

Бонус! Как заставить тамагочи жить, даже если программа закрыта?

Можно вычислять состояние питомца исходя из времени прошлого кормления / игры / купания, а это время сохранять в файл. Для простоты давайте использовать отдельные файлы для каждого действия — кормежки / игры и тд. Ниже пример с едой, для остальных — по аналогии.

Как сохранить время действия в файл?

import time # предположим, мы только что покормили питомца, фиксируем сколько сейчас времени last_feed_time = time.time() # открываем файл для записи with open('last_feed_time.txt', 'w') as file: # превращаем время в строку и записываем в файл file.write(str(last_feed_time))

Как достать время последнего из файла?

import time # если файл существует try: # открываем файл для чтения with open('last_feed_time.txt', 'r') as file: # и считываем время прошлой кормежки last_feed_time = int(file.read()) # а если файла нет except: # считаем, что только покормили last_feed_time = time.time()

Как вычислить сколько сейчас «жизни» исходя из прошедшего времени?

import time # это значение нужно взфть из файла, для примера просто возьмем текущее время минус 40 секунд last_feed_time = time.time() - 40 # максимум "жизни" max_life = 100 # сколько секунд на одну единицу "жизни" seconds_for_life_point = 10 # сколько времени прошло с прошлого кормления elapsed_time = time.time() - last_feed_time # жизнь не может быть меньше нуля life = max(0, int(max_life - elapsed_time / seconds_for_life_point))

Бонус! Прогресс-бар для отображения статуса питомца.

from tkinter.ttk import * from tkinter import * from tkinter import messagebox life = 100 # Функция для уменьшения жизни каждую секунду def check_life(): global life # уменьшаем жизнь life -= 1 # узаписываем жизнь в прогрессбар progress['value'] = life # если жизни мало - закрываем приложение if life 

Как импортировать (загрузить) изображение в python?

Язык программирования Python

Примеры того, как импортировать (загрузить) изображение в python:

Импорт изображения с помощью matplotlib

Чтобы импортировать изображение в python, одним из решений является использование matplotlib:

from matplotlib import image from matplotlib import pyplot as plt img = image.imread("fav.jpg")
Code language: JavaScript (javascript)
print(type(img)) print(img.shape)
Code language: PHP (php)
class 'numpy.ndarray'>
Code language: HTML, XML (xml)
(300, 450, 3)

3 соответствует режиму RGB.

После этого можно вывести изображение с помощью imshow из matplotlib в виде графика.

plt.imshow(img) plt.show()
Code language: CSS (css)

Импорт изображения с помощью Pillow

Другое решение – использовать Pillow

from PIL import Image from matplotlib import pyplot as plt img= Image.open("fav.jpg")
Code language: JavaScript (javascript)
type(img)

не является массивом numpy:

PIL.JpegImagePlugin.JpegImageFile
Code language: CSS (css)

Тем не менее, все еще можно вывести изображение на экран с помощью imshow

plt.imshow(img) plt.show()
Code language: CSS (css)

Для преобразования img в матрицу numpy

import numpy as np img = np.asarray(img)
Code language: JavaScript (javascript)

Функция Image.open() модуля Pillow в Python

Способы открыть изображение для редактирования в Python

Содержание:

  • Синтаксис и описание функции Image.open() ;
  • Жизненный цикл изображения;
  • Примеры использования функции Image.open() .

Синтаксис и описание функции Image.open() :

from PIL import Image img = Image.open(fp, mode='r', formats=None) 

Параметры:

  • fp - имя файла (строка), pathlib.Path объект или объект file . Объект file должен иметь методы file.read , file.seek и file.tell методы и открыт в двоичном режиме.
  • mode='r' - режим. Если задан, то должен быть r .
  • formats=None - список или кортеж форматов, в которых нужно попытаться загрузить файл. Аргумент можно использовать для ограничения набора проверяемых форматов. Значение None означает все поддерживаемые форматы. Можно распечатать набор доступных форматов, запустив python3 -m PIL или используя функцию PIL.features.pilinfo() .

Возвращаемое значение:

  • Объект изображения Image .

Описание:

Функция Image.open() модуля Pillow открывает и идентифицирует данный файл изображения.

Это ленивая операция. Функция Image.open() идентифицирует файл, файл остается открытым, а фактические данные изображения не считываются до тех пор, пока не будет предпринята попытка обработать данные (или не будет вызван метод img.load() .

Пользователи библиотеки должны использовать диспетчер контекста или вызывать img.close() для любого изображения, открытого с помощью имени файла или объекта pathlib.Path для закрытия базового файла.

Способы открытия файла:

from PIL import Image import io import pathlib with Image.open("test.jpg") as img: . with Image.open(pathlib.Path("test.jpg")) as img2: . with open("test.jpg", "rb") as f: img3 = Image.open(f) . with open("test.jpg", "rb") as f: img4 = Image.open(io.BytesIO(f.read())) . 

Если имя файла или объект pathlib.Path передается Pillow, то результирующий файловый объект, открытый Pillow, также может быть закрыт Pillow после вызова метода img.load() , при условии, что связанное изображение не имеет нескольких кадров.

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

Возможные исключения при открытии файла изображения:

  • FileNotFoundError : если файл не найден.
  • PIL.UnidentifiedImageError : если изображение не может быть идентифицировано и открыто.
  • ValueError : если аргумент моде не r или если для файлового потока fp используется экземпляр StringIO .
  • TypeError : если аргумент formats не содержит открываемого формата изображения.

Жизненный цикл изображения.

  1. Имена файлов и объекты pathlib.Path открываются Image.open() как файл. Из открытого файла считываются метаданные. Файл остается открытым для дальнейшего использования.
  2. Когда требуются пиксельные данные изображения, вызывается метод img.load() . Текущий кадр считывается в память. Изображение теперь можно использовать независимо от базового файла изображения.
  3. Любой метод Pillow, который создает новый экземпляр изображения на основе другого, будет внутренне вызывать img.load() для исходного изображения, а затем считывать данные. Новый экземпляр изображения не будет связан с исходным файлом изображения.
  4. Если имя файла или объект pathlib.Path были переданы Image.open() , то файловый объект был открыт Pillow и считается, что он используется исключительно Pillow. Таким образом, если изображение представляет собой однокадровое изображение, файл будет закрыт в этом методе после того, как кадр будет прочитан. Если изображение представляет собой многокадровое изображение (например, многостраничный TIFF и анимированный GIF ), файл изображения остается открытым, чтобы img.seek() мог загрузить соответствующий кадр.
  5. Метод img.close() закрывает файл и уничтожает основной объект изображения. Менеджер контекста Pillow также закроет файл, но не уничтожит основной объект изображения.
with Image.open("test.jpg") as img: img.load() assert img.fp is None img.save("test.png") 

Жизненный цикл однокадрового изображения относительно прост. Файл должен оставаться открытым до тех пор, пока не будет вызвана функция img.load() или img.close() или не завершится контекстный менеджер.

Многокадровые изображения более сложны. Метод img.load() не является терминальным методом, поэтому он не должен закрывать базовый файл. Как правило, Pillow не знает, будут ли какие-либо запросы на дополнительные данные, пока вызывающая сторона явно не закроет изображение.

Примеры использования функции Image.open() .

  • Идентификация файлов изображений;
  • Открыть изображение по URL;
  • Чтение изображений из архива tar ;
  • Чтение изображения в режиме черновика;
  • Создание миниатюр.

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

from PIL import Image with Image.open("test.jpg") as img: img.rotate(45).show() 

Идентификация файлов изображений.

import sys from PIL import Image for infile in sys.argv[1:]: try: with Image.open(infile) as img: print(infile, img.format, f"img.size>ximg.mode>") except OSError: pass 

Открыть изображение по URL.

from PIL import Image from urllib.request import urlopen url = "https://python-pillow.org/images/pillow-logo.png" with Image.open(urlopen(url)) as img: img.save('pillow-logo.png') 

Чтение изображений из архива tar .

from PIL import Image, TarIO with TarIO.TarIO("test.tar", "hopper.jpg") as fp: img = Image.open(fp) 

Чтение изображения в режиме черновика.

Доступно только для файлов JPEG и MPO.

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

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

from PIL import Image with Image.open(file) as img: print("original =", img.mode, img.size) img.draft("L", (100, 100)) print("draft =", img.mode, img.size) 

Создание миниатюр.

Следующий код создает красивые эскизы всех изображений JPEG в текущем каталоге, сохраняя соотношение сторон с максимальным разрешением 128x128.

from PIL import Image import glob, os size = 128, 128 for infile in glob.glob("*.jpg"): file, ext = os.path.splitext(infile) with Image.open(infile) as img: img.thumbnail(size) img.save(f"file>.thumbnail", "JPEG") 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Функция 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

Pillow — работа с картинками

Pillow — самая популярная библиотека для работы с изображениями в Python. С помощью неё картинки можно открывать, вращать, накладывать фильтры и даже работать с отдельными пикселями.

Обзор

Импортируется библиотека так:

from PIL import Image 

Pillow — улучшенная версия библиотеки PIL , поэтому импортируется она таким странным образом. В коде она будет называться PIL .

Далее попробуем что-нибудь сделать с картинкой:

from PIL import Image image = Image.open("example.jpg") rotated_image = image.rotate(45) rotated_image.save("rotated.jpg") 

Сначала открываем картинку с названием example.jpg и кладём её в переменную image . На следущей строке поворачиваем картинку на 45 градусов. Метод .rotate() не меняет картинку, а создаёт новую, поэтому положим её в переменную rotated_image . И в конце сохраняем повёрнутую картинку в новый файл rotated.jpg .

Атрибуты картинок

В Pillow есть новые типы данных: JpegImageFile , PngImageFile … Они позволяют хранить картинки прямо в переменных Python. У картинок есть несколько атрибутов, которые понадобятся вам в будущем:

  • format — формат данных картинки: jpeg , png …
  • mode — цветовая модель картинки: CMYK , RGB , L — для чёрно-белых изображений.
  • width — ширина картинки в пикселях.
  • height — высота картинки в пикселях.
  • size — размер картинки в пикселях. Возвращает tuple : (ширина, высота).

Как их извлечь:

from PIL import Image image = Image.open("example.jpg") print(image.format) # Выведет JPG print(image.mode) # Например, может вывести RGB 

Открыть картинку

Для открытия картинки используется функция Image.open() .

В качестве аргументов она принимает на вход путь до файла, который нужно открыть:

from PIL import Image image = Image.open("example.jpg") 

Сохранить картинку в файл

Для сохранения картинки есть метод .save() .

В качестве аргументов он принимает:

  • Путь до файла, в который сохранить картинку.
  • Именованный необязательный параметр format , в котором передаётся формат сохраняемой картинки.
from PIL import Image image = Image.open("example.jpg") image.save("new.jpg") image.save("another.jpg", format="JPEG") 

В качестве результата появится 2 копии картинки: new.jpg и another.jpg .

Перевести картинку в другую цветовую модель

О цветовой модели вы можете прочитать в разделе Атрибуты. Чтобы поменять цветовую модель картинки, нужно воспользоваться методом .convert() . Он принимает на вход именной аргумент mode :

from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вывелось RGB cmyk_image = image.convert("CMYK") print(cmyk_image.mode) # Вывелось CMYK print(image.mode) # Вывелось RGB 

Заметим, что метод не меняет исходную картинку, а создаёт её копию с цветовой моделью CMYK . Поэтому мы положили её в отдельную переменную.

Обрезать картинку

За обрезание картинки отвечает метод .crop() . Он принимает на вход кортеж из 4 чисел: координат углов новой картинки. Координаты отсчитываются с левого верхнего угла картинки:

Координаты нужно передать в таком порядке: слева, сверху, справа, снизу. Например, вы хотите отрезать 10 пикселей слева и 15 сверху:

from PIL import Image image = Image.open("example.jpg") coordinates = (10, 15, image.width, image.height) cropped = image.crop(coordinates) # Отрежется 10 пикселей слева и 15 сверху 

Этот код отрезает 10 пикселей слева и 15 сверху. Самая правая координата — это и есть ширина картинки, а самая нижняя — высота, поэтому мы и использовали эти атрибуты картинки.

Разделить картинку на каналы

Картинки состоят из пикселей разных цветов. Каждый пиксель картинки в RGB состоит из 3 значений: сколько в нём красного, сколько зелёного и сколько синего. А в цветовой схеме CMYK из четырёх: голубой, пурпурный, жёлтый и чёрный. Все значения от 0 до 255. 0 — нет такого цвета, а 255 — его очень-очень много.

На самом деле картинки хранят не по пикселям, а по каналам. RGB картинка хранится как 3 картинки: в первой в каждом пикселе число от 0 до 255, показывающее, сколько в нём красного. Во второй то же, только с зелёным, а в третьем — с синим.

Получается 3 картинки. Но если взять какой-то цветовой канал отдельно от картинки, то она не будет знать, какой цвет ей показывать. У неё в каждом пикселе всего одно значение от 0 до 255. Поэтому она отображается как чёрно-белая. Если в пикселе хранится 0, то пиксель будет чёрный, а если 255 — белый. Чем больше число, тем светлее пиксель.

Метод .split() разбивает картинку на каналы. Работает так:

from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вернуло CMYK, значит канала 4 cyan, magenta, yellow, key_color = image.split() # В переменные запишутся 4 чёрно-белые картинки. 

Собрать картинку из каналов

Pillow позволяет разделять картинку на каналы. Но так же позволяет и собирать её обратно. За это отвечает функция Image.merge() . Она принимает на вход 2 аргумента:

  • Цветовая модель будущей картинки
  • Кортеж из цветовых каналов. Если модель RGB, то первый канал будет покрашен в красный, второй в зелёный, третий в синий.
from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вернуло CMYK, значит канала 4 cyan, magenta, yellow, key_color = image.split() # В переменные запишутся 4 чёрно-белые картинки. new_image = Image.merge("CMYK", (cyan, magenta, yellow, key_color)) 

new_image ничем не отличается от image , т.к. состоит из тех же каналов в том же порядке.

Покрасить цветовой канал

Pillow позволяет раскрашивать чёрно-белые картинки. За это отвечает функция ImageOps.colorize() .

Она принимает 3 аргумента: Картинка, какой цвет показывать вместо чёрного и какой вместо белого. Пример:

from PIL import Image, ImageOps image = Image.open("example.jpg") colorized = ImageOps.colorize(image, black ="red", white ="yellow") 

Код выше сделает из такой картинки:

Изменить размер картинки

Как работает thumbnail

Метод resize приводит картинку к желаемому размеру без сохранения пропорций. Картинка жмётся, становится некрасивой:

Метод thumbnail сохраняет пропорции:

Подробнее о thumbnail

С помощью метода .thumbnail() можно легко сделать миниатюру изображения. Миниатюра — уменьшенная версия картинки, с сохранением пропорций. На вход принимается кортеж с максимальными шириной и высотой. Метод .thumbnail() сам подберёт новые координаты так, чтобы картинка поместилась в заданную область. Например, у вас есть картинка 800x1200 и вы хотите поместить её в рамку 1200x600, то результат метода будет 400x600, т.к. 400x600 как раз помещается в 1200x600:

from PIL import Image image = Image.open("example.jpg") print(image.size) # Вывелось (800, 1200) image.thumbnail((1200, 600)) # Картинка теперь размера 400 на 600 print(image.size) # Вывелось (400, 600) 

Наложить картинки друг на друга

Функция Image.blend() создаёт новую картинку, накладывая одно изображение поверх другого. Для работы ему необходимы три аргумента:

  • Первая картинка.
  • Вторая картинка, того же размера, что и первая.
  • Коэффициент прозрачности.

Если прозрачность равна 0.5, то картинки смешаются в равных долях. Если коэффициент равен 1.0, то первая картинка станет полностью прозрачной и останется только вторая. Если 0.0, то наоборот. Прозрачность задаётся дробным числом через точку.

from PIL import Image image1 = Image.open("image1.jpg") image2 = Image.open("image2.jpg") image3 = Image.blend(image1, image2, 0.5) # Получится картинка, сложенная из двух 

Наложить со смещением

Отдельного метода для этого нет, но получается за счёт комбинации .crop() и Image.blend().

  1. Выберите картинку для эффекта. У нас это картинка wave.png с шириной в 1000 пикселей.
  2. Отрежьте от неё 200 пикселей слева. Получится wave_left.png шириной 800 пикселей.
  3. Возьмите исходную картинку wave.png и отрежьте от неё по 100 пикселей с обоих сторон: слева и справа. Получится wave_middle.png тоже шириной в 800 пикселей.
  4. Наложите wave_left.png на wave_middle.png с помощью Image.blend()
  5. Сохраните в файл то, что получилось. Это картинка смещённая влево.

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

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

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