Как нарисовать персонажа градиентными цветами с помощью PIL? - PullRequest
2 голосов
/ 04 августа 2020

У меня есть функция, которая генерирует изображения символов из файла шрифта с использованием PIL. В текущем примере он генерирует белое фоновое изображение и текст с красными символами. Сейчас я хочу, чтобы вместо чистого красного или любого другого цвета я мог генерировать цвет градиента. Возможно ли это с моим текущим кодом? Я видел это сообщение , но мне это не помогло.

Изменить 1:

В настоящее время я генерирую английский sh алфавит изображения из файлов шрифтов с использованием PIL. Переменная fonts в моем коде содержит N файлов ".ttf". предположим, что N = 3 все в разных стилях, например style1, style2, style3. Мой текущий код всегда будет генерировать эти N разных стилей с фиксированным белым фоном и фиксированным красным цветом символов. Как показано на рисунке ниже.

Style1

Style2

Style3

Instead of red color for the characters, I would like to apply gradients for each style. i.e. all characters in style1 font images should have the same gradient, style 2 font style should have a different gradient from style1 characters but should be the same for all of its characters and so on. As shown below (styles are different from the above images. Its just for demonstration of what I want).

gradient Style1

gradient Style2

градиент Style3

Мой код на данный момент:

fonts = glob.glob(os.path.join(fonts_dir, '*.ttf'))
for font in fonts:
  image = Image.new('RGB', (IMAGE_WIDTH, IMAGE_HEIGHT), color='white')
  font = ImageFont.truetype(font, 150)
  drawing = ImageDraw.Draw(image)
  w, h = drawing.textsize(character, font=font)
  drawing.text(
  ((IMAGE_WIDTH-w)/2, (IMAGE_HEIGHT-h)/2),
  character,
  fill='red',
  font=font
  )
  image.save(file_path, 'PNG')

1 Ответ

1 голос
/ 04 августа 2020

Один довольно простой способ сделать это - нарисовать текст белым цветом на черном фоне, а затем использовать его как канал альфа / прозрачности на фоне с градиентом.

Вот градиент фона:

enter image description here

#!/usr/bin/env python3

from PIL import Image, ImageDraw, ImageFont

w, h = 400, 150
image = Image.open('gradient.jpg').rotate(90).resize((w,h))
font = ImageFont.truetype('/System/Library/Fonts/MarkerFelt.ttc', 80)

# Create new alpha channel - solid black
alpha = Image.new('L', (w,h))
draw = ImageDraw.Draw(alpha)
draw.text((20,10),'Some Text',fill='white',font=font)
alpha.save('alpha.png')

# Use text cutout as alpha channel for gradient image
image.putalpha(alpha)
image.save('result.png')
 

The alpha.png looks like this:

enter image description here

And the result.png looks like this:

enter image description here

Note that the area around the text is transparent. but you can easily paste it onto a white or black background. So, say you wanted the background yellow, add the following to the bottom of the code above:

solid = Image.new('RGB', (w,h), 'yellow')
solid.paste(image,image)
solid.save('result2.png')

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...