2011-11-08 8 views
10

मैं विभिन्न स्ट्रोक के साथ टेक्स्ट कैसे आकर्षित कर सकता हूं और पाइथन के साथ छवियों पर रंग कैसे भर सकता हूं?मैं विभिन्न स्ट्रोक के साथ टेक्स्ट कैसे आकर्षित कर सकता हूं और पाइथन के साथ छवियों पर रंग कैसे भर सकता हूं?

यहां लाल स्ट्रोक और ग्रे भरने वाला कुछ पाठ है।

Example

मैं जनहित याचिका के साथ ऐसा करने की कोशिश की लेकिन वहाँ स्ट्रोक रंग की स्थापना के लिए कोई विकल्प नहीं था।

उत्तर

8

का उपयोग cairo (here से लिया ज्यादा कोड के साथ):

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

टिप्पणी:

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

क्या मुझे इसका उपयोग करने के लिए पाठ के आयामों को जानने की आवश्यकता है? –

+0

मैं आवश्यक जानकारी Context.text_extents ("उदाहरण") के साथ प्राप्त कर सकता हूं लेकिन इसके बाद मुझे सही चौड़ाई और ऊंचाई के साथ एक नई सतह बनाने की आवश्यकता है। –

+0

हां, दुर्भाग्य से, मुझे एक बेहतर तरीका नहीं पता है। – unutbu

4

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

कूल मैंने किया .format (** args) के बारे में नहीं पता –

+0

क्या मुझे इसे बनाने से पहले आउटपुट टेक्स्ट के आयामों को जानने की आवश्यकता है? –

+0

आप अपनी इच्छानुसार किसी भी 'ज्यामिति' का उपयोग कर सकते हैं - Imagemagick जब तक आप विस्मयादिबोधक बिंदु का उपयोग करते हैं, तब तक उस ज्यामिति की एक छवि तैयार करेगी - लेकिन यदि फ़ॉन्ट 'आकार' बहुत बड़ा है, तो टेक्स्ट का हिस्सा फसल हो सकता है । – unutbu

7

जनहित याचिका इस का समर्थन नहीं करता, लेकिन आप नकली यह कर सकते हैं:

: पाठ चार या आठ बार रूपरेखा रंग के साथ एक पिक्सेल ऑफसेट का उपयोग कर प्रस्तुत
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 पर।

+1

8x संस्करण मूल रूप से केवल विकर्णों पर 4 बार प्रतिपादन के बराबर है। –

+0

क्या यह एक तेज प्रदर्शन हिट नहीं है? –

+0

@ हसनबाग आप इसे नोटिस नहीं करेंगे। –

1

आप इंकस्केप उपयोग कर सकते हैं आप इंकस्केप इस का उपयोग करने के डाउनलोड करने के लिए है, इसलिए स्थायी उपयोग के लिए व्यावहारिक नहीं

संबंधित मुद्दे