2011-11-08 31 views

Trả lời

8

Sử dụng cairo (với nhiều mã lấy từ here):

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

+0

Tôi có cần biết kích thước của văn bản để sử dụng không? –

+0

Tôi có thể nhận được thông tin cần thiết với Context.text_extents ("Example") nhưng sau đó tôi cần tạo một bề mặt mới với chiều rộng và chiều cao chính xác. –

+0

Có, thật không may, tôi không biết cách nào tốt hơn. – unutbu

4

Sử dụng 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

+0

tuyệt vời tôi đã làm không biết về .format (** args) –

+0

Tôi có cần biết kích thước của văn bản đầu ra trước khi tôi có thể tạo nó không? –

+0

Bạn có thể sử dụng bất kỳ 'hình học' nào bạn muốn - imagemagick sẽ tạo ra hình ảnh chính xác của hình đó miễn là bạn sử dụng dấu chấm than - nhưng nếu phông chữ' kích thước' quá lớn, một phần của văn bản có thể bị cắt . – unutbu

7

PIL không hỗ trợ này, nhưng bạn có thể giả mạo nó: Render nội dung bốn hoặc tám lần với màu phác thảo bằng một offsets điểm ảnh:

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

(phiên bản bốn lần)

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 

(phiên bản tám lần)

và sau đó một lần tại x,y với màu tô đầy.

+1

Phiên bản 8x về cơ bản tương đương với hiển thị 4 lần chỉ trên các đường chéo. –

+0

Đây không phải là một hit hiệu suất dốc? –

+0

@HassanBaig Bạn sẽ không nhận thấy nó. –

1

Bạn có thể sử dụng Inkscape:

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

lưu ý: bạn phải tải Inkscape sử dụng điều này, do đó không thực tế để sử dụng vĩnh viễn

Các vấn đề liên quan