Используем Python Pillow для вставки текста и изображения в картинку


12 июня 2020


Вставка текста и изображения в картинку с Python Pillow (PIL)

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

Pillow устанавливается отдельно:

pip install Pillow

 

Создание и открытие изображения

Для открытия и создания изображения используется модуль Image. На следующем примере мы откроем существующее изображение:

from PIL import Image

im = Image.open('d:/beach.jpeg')
# Откроет изображение в новом окне
im.show()

В следующем примере мы создадим изображение, где мы должны указать:

  • Цветовую модель. Например RGB,RGBA,CMYK,HCL и т.д.;
  • Размер изображения в кортеже;
  • По умолчанию изображение создается с черным фоном. Для его изменения нужно заполнить атрибут color.
from PIL import Image

im = Image.new('RGB', (200,200), color=('#FAACAC'))
# Откроет изображение в новом окне
im.show()

Сохранить изображение можно через save:

from PIL import Image

im = Image.new('RGB', (200,200), color=('#FAACAC'))
im.save('D:/new_pic.jpg')

 

Добавление текста к изображению

Для изменения изображение используется класс ImageDraw. В следующем примере мы создадим объект этого класса с текстом, где нужно указать:

  • Расположение текста. В примере ниже это (100, 100);
  • Сам текст;
  • Цвет текста.
from PIL import Image, ImageDraw

im = Image.new('RGB', (200,200), color=('#FAACAC'))
draw_text = ImageDraw.Draw(im)
draw_text.text(
    (100,100),
    'Test Text',
    fill=('#1C0606')
    )
im.show()

Если использовать кириллические символы, может появится ошибка:

  • AttributeError: 'ImageFont' object has no attribute 'getmask2'
  • UnicodeEncodeError: 'latin-1' codec can't encode characters

Для исправления ошибки вы можете использовать свой шрифт через класс ImageFont. Вы так же сможете указать размер шрифта:

from PIL import Image, ImageDraw, ImageFont

im = Image.new('RGB', (200,200), color=('#FAACAC'))
# Создаем объект со шрифтом
font = ImageFont.truetype('D:/Roboto/Roboto-Black.ttf', size=18)
draw_text = ImageDraw.Draw(im)
draw_text.text(
    (100, 100),
    'Текст 18px',
    # Добавляем шрифт к изображению
    font=font,
    fill='#1C0606')
im.show()

 

Вставка изображения

Для создания водяного знака, например, откройте второе изображение и используйте функцию paste. При этом первый параметр с watermark будет использовать всю область изображения, а второй установит прозрачность (альфа-канал):

from PIL import Image

im = Image.open('d:/beach.jpeg')
# Изображение для водяного знака
watermark = Image.open('d:/logo.png')
im.paste(watermark, (25,25), watermark)

im.show()

 

Определение высоты и ширины

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

# Ширина и высота
im.size
# Ширина
im.width
# Высота
im.height

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

from PIL import Image

im = Image.open('d:/beach.jpeg')
watermark = Image.open('d:/logo.png')
# Вычисляем расположение watermark
position = (im.width - watermark.width,
             im.height - watermark.height)
im.paste(watermark, position, watermark)

im.show()

...

Теги: #python #pillow


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.