Как нарисовать текст с изображением в фоновом режиме - PullRequest
0 голосов
/ 11 мая 2018

Я хочу сделать что-то вроде этого питона.Example Image

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

1 Ответ

0 голосов
/ 12 мая 2018

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

Используемый подход кратко описан (очень) в этом ответе на вопрос
Возможно ли замаскировать изображение в Python Imaging Library (PIL)? @Mark Ransom… ниже приведена лишь иллюстрация его применения для достижения желаемого результата.

from PIL import Image, ImageDraw, ImageFont

BACKGROUND_IMAGE_FILENAME = 'cookie_cutter_background_cropped.png'
RESULT_IMAGE_FILENAME = 'cookie_cutter_text_result.png'
THE_TEXT = 'LOADED'
FONT_NAME = 'arialbd.ttf'  # Arial Bold

# Read the background image and convert to an image with alpha.
with open(BACKGROUND_IMAGE_FILENAME, 'rb') as file:
    bgr_img = Image.open(file)
    bgr_img = bgr_img.convert('RGBA')  # Make sure it has alpha.
    bgr_img_width, bgr_img_height = bgr_img.size
    cx, cy = bgr_img.size[0] // 2, bgr_img.size[1] // 2 # Image center.

# Create a transparent foreground to be result of non-text areas.
fgr_img = Image.new('RGBA', bgr_img.size, color=(0,0,0,0))

# Create a mask layer and render the text string onto it.
font_size = bgr_img_width // len(THE_TEXT)
font = ImageFont.truetype(FONT_NAME, font_size)

txt_width, txt_height = font.getsize(THE_TEXT)
tx, ty = cx - txt_width//2, cy - txt_height//2  # Center text.

mask_img = Image.new('L', bgr_img.size, color=255)
mask_img_draw = ImageDraw.Draw(mask_img)
mask_img_draw.text((tx, ty), THE_TEXT, fill=0, font=font, align='center')

res_img = Image.composite(fgr_img, bgr_img, mask_img)
res_img.save(RESULT_IMAGE_FILENAME)
res_img.show()

Который, используя следующие BACKGROUND_IMAGE:

background image

создает изображение, показанное ниже, которое просматривается в Photoshop, поэтому прозрачный фон, который он имеет, будет различим (не в масштабе):

result image produced

Вот увеличение, показывающее плавно отображаемые края символов:

magnified section of resulting image

...