Как я могу нарисовать текст с разными штрихами и заполнить цвета на изображениях с помощью python?

Как я могу нарисовать текст с разными штрихами и заполнить цвета на изображениях с помощью python?

Вот текст с красным штрихом и серым заливом.

Example

Я попытался сделать это с помощью PIL, но не было возможности установить цвет штриха.

Ответ 1

Использование cairo (с большим количеством кода, взятого из здесь):

import cairo

def text_extent(font, font_size, text, *args, **kwargs):
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 0, 0)
    ctx = cairo.Context(surface)
    ctx.select_font_face(font, *args, **kwargs)
    ctx.set_font_size(font_size)
    return ctx.text_extents(text)

text='Example'
font="Sans"
font_size=55.0
font_args=[cairo.FONT_SLANT_NORMAL]
(x_bearing, y_bearing, text_width, text_height,
 x_advance, y_advance) = text_extent(font, font_size, text, *font_args)
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(text_width), int(text_height))
ctx = cairo.Context(surface)
ctx.select_font_face(font, *font_args)
ctx.set_font_size(font_size)
ctx.move_to(-x_bearing, -y_bearing)
ctx.text_path(text)
ctx.set_source_rgb(0.47, 0.47, 0.47)
ctx.fill_preserve()
ctx.set_source_rgb(1, 0, 0)
ctx.set_line_width(1.5)
ctx.stroke()

surface.write_to_png("/tmp/out.png")

enter image description here

Ответ 2

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

x+1,y
x-1,y
x  ,y+1
x  ,y-1 

(четырехкратная версия)

x+1,y+1
x  ,y+1
x-1,y+1

x+1,y
x-1,y

x+1,y-1
x  ,y-1 
x-1,y-1

(восьмикратная версия)

а затем один раз в x,y с цветом заливки.

Ответ 3

Использование imagemagick:

import subprocess

args = {
    'bgColor': 'transparent',
    'fgColor': 'light slate grey',
    'fgOutlineColor': 'red',
    'text': 'Example',
    'size': 72,
    'geometry': '350x100!',
    'output': '/tmp/out.png',
    'font': 'helvetica'
}

cmd = ['convert', 'xc:{bgColor}', '-resize', '{geometry}', '-gravity', 'Center', 
       '-font', '{font}', '-pointsize', '{size}', '-fill', '{fgColor}', 
       '-stroke', '{fgOutlineColor}', '-draw', "text 0,0 '{text}'", '-trim', '{output}']
cmd = [item.format(**args) for item in cmd]

proc = subprocess.Popen(cmd)
proc.communicate()

enter image description here

Ответ 4

Вы можете использовать Inkscape:

import subprocess
subprocess.call("inkscape in.svg --export-text-to-path --export-plain-svg out.svg", shell = True)

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