2011-11-24 17 views
11

में लपेटें पाठ मैं एक छवि पर पाठ खींचने के लिए पीआईएल का उपयोग कर रहा हूं। मैं पाठ की एक स्ट्रिंग कैसे लपेटूंगा। यह मेरा कोड है:पीआईएल

text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 

image = Image.open("/tmp/background-image.jpg") 
draw = ImageDraw.Draw(image) 
font = ImageFont.truetype("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"), 50, encoding='unic') 
draw.text((100, 100), text, font=font, fill="#aa0000") 
image.save("/tmp/image.jpg") 

उत्तर

10

आपको टेक्स्ट को सही लंबाई की रेखाओं में विभाजित करने की आवश्यकता होगी, और फिर प्रत्येक पंक्ति को अलग-अलग आकर्षित करें।

दूसरा भाग आसान है, लेकिन अगर पहले-भाग चौड़ाई वाले फ़ॉन्ट का उपयोग किया जाता है तो पहला भाग सटीक रूप से करना मुश्किल हो सकता है। तो निश्चित-चौड़ाई फ़ॉन्ट्स उपयोग किया जाता है, या अगर सटीकता फर्क नहीं पड़ता कि ज्यादा है, तो आप सिर्फ textwrap मॉड्यूल किसी दिए गए वर्ण चौड़ाई की तर्ज में पाठ विभाजित करने के लिए उपयोग कर सकते हैं:

margin = offset = 40 
for line in textwrap.wrap(text, width=40): 
    draw.text((margin, offset), line, font=font, fill="#aa0000") 
    offset += font.getsize(line)[1] 
+0

यह वर्णों की संख्या, वास्तविक नहीं चौड़ाई से बंटवारे है – User

3

ठीक है, आप इसे मैन्युअल रूप से कर सकते हैं, \ n हर बार जब आप पाठ को लपेटना चाहते हैं। यदि आपके पास हर बार अलग-अलग स्ट्रिंग है लेकिन परिणाम पर पूरा नियंत्रण देता है तो यह सबसे अच्छा तरीका नहीं है। लेकिन टेक्स्टव्रप मॉड्यूल भी है। आप इसे इस तरह से उपयोग कर सकते हैं:

import textwrap 
texto = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 
novo = textwrap.wrap(texto, width=20) 
print(novo) 

परिणाम:

>>> 
['Lorem ipsum dolor', 'sit amet,', 'consectetur', 'adipisicing elit,', 'sed do eiusmod', 'tempor incididunt ut', 'labore et dolore', 'magna aliqua. Ut', 'enim ad minim', 'veniam, quis nostrud', 'exercitation ullamco', 'laboris nisi ut', 'aliquip ex ea', 'commodo consequat.', 'Duis aute irure', 'dolor in', 'reprehenderit in', 'voluptate velit esse', 'cillum dolore eu', 'fugiat nulla', 'pariatur. Excepteur', 'sint occaecat', 'cupidatat non', 'proident, sunt in', 'culpa qui officia', 'deserunt mollit anim', 'id est laborum.'] 

पिछले स्ट्रिंग चौड़ाई आप determinated के अनुसार लिपटे पर शब्दों की एक सूची देता है।

0

स्वीकार किए जाते हैं wraps पाठ आधारित प्रति पंक्ति 40 वर्णों की निश्चित सीमा पर, बॉक्स चौड़ाई (पिक्सेल में) या फ़ॉन्ट आकार को ध्यान में रखते हुए। यह आसानी से अंडरफिल या ओवरफिल का कारण बन सकता है।

यहाँ एक बेहतर समाधान है - एक सरल कोड स्निपेट फ़ॉन्ट आधारित चौड़ाई माप का उपयोग करके पाठ रैप को संभालने के लिए: - यानी एक छवि पर फिट करने के लिए https://gist.github.com/turicas/1455973