2011-10-08 16 views
23

मैं छवि के नीचे पाठ जोड़ने की कोशिश करता हूं और वास्तव में मैंने इसे किया है, लेकिन मेरे पाठ के लंबे समय के मामले में छवि चौड़ाई यह दोनों पक्षों से कट जाती है, सरल बनाने के लिए पाठ की तरह कई पंक्तियों में होना चाहिए यदि यह छवि चौड़ाई से अधिक लंबा है। प्रत्येक ज्यादा से ज्यादा width वर्ण लंबा आप textwrap.wrap इस्तेमाल कर सकते हैं स्ट्रिंग की एक सूची में text तोड़ने के लिएपायथन पीआईएल छवि पर मल्टीलाइन टेक्स्ट खींचें

FOREGROUND = (255, 255, 255) 
WIDTH = 375 
HEIGHT = 50 
TEXT = 'Chyba najwyższy czas zadać to pytanie na śniadanie \n Chyba najwyższy czas zadać to pytanie na śniadanie' 
font_path = '/Library/Fonts/Arial.ttf' 
font = ImageFont.truetype(font_path, 14, encoding='unic') 
text = TEXT.decode('utf-8') 
(width, height) = font.getsize(text) 

x = Image.open('media/converty/image.png') 
y = ImageOps.expand(x,border=2,fill='white') 
y = ImageOps.expand(y,border=30,fill='black') 

w, h = y.size 
bg = Image.new('RGBA', (w, 1000), "#000000") 

W, H = bg.size 
xo, yo = (W-w)/2, (H-h)/2 
bg.paste(y, (xo, 0, xo+w, h)) 
draw = ImageDraw.Draw(bg) 
draw.text(((w - width)/2, w), text, font=font, fill=FOREGROUND) 


bg.show() 
bg.save('media/converty/test.png') 

उत्तर

33

,: यहाँ मेरी कोड है

import textwrap 
lines = textwrap.wrap(text, width=40) 
y_text = h 
for line in lines: 
    width, height = font.getsize(line) 
    draw.text(((w - width)/2, y_text), line, font=font, fill=FOREGROUND) 
    y_text += height 
+0

धन्यवाद एक बहुत:

यहाँ एक सरल पुस्तकालय जो सही ढंग से समस्या का हल है! बस कॉपी और पेस्ट करें और यह एक आकर्षण की तरह काम करता है। आप सबसे अच्छे हैं :) – user985541

+0

'40' का प्रतिनिधित्व क्या करता है? – User

+1

@User '40' अधिकतम वर्णों का प्रतिनिधित्व करता है। इसका अर्थ यह है कि यह एक नई लाइन पर लपेटने से पहले अधिकतम या 40 वर्णों की अनुमति देगा। लेकिन अगर एक शब्द 10 अक्षर है और फिर अगला 31 है, तो यह पहले शब्द के बाद सही होगा क्योंकि यह लाइन पर पहले और दूसरे शब्द को फिट नहीं कर सकता है। – teewuane

0
text = textwrap.fill("test ",width=35) 
self.draw.text((x, y), text, font=font, fill="Black") 
+1

एसओ में आपका स्वागत है! क्या आप यह समझाने के लिए बहुत दयालु हो सकते हैं कि यह सवाल कैसे हल करता है? कुछ अतिरिक्त टेक्स्ट अन्य उपयोगकर्ताओं के लिए एक लंबा रास्ता तय करेंगे। –

+0

यह @ unutbu के उत्तर का एक संक्षिप्त संस्करण है। यह वर्तमान में सुझाया गया सबसे अच्छा कोड है, और कुछ और स्पष्टीकरण के साथ स्वीकार्य उत्तर होना चाहिए। – Quantum7

-2

आप PIL.ImageDraw.Draw.multiline_text() इस्तेमाल कर सकते हैं।

draw.multiline_text((WIDTH, HEIGHT), TEXT, fill=FOREGROUND, font=font) 

तुम भी एक ही परम नाम का उपयोग spacing या align निर्धारित किया है।

+0

काम नहीं करता है, मैंने अभी कोशिश की है। क्या आप उपयोग के मामले का विस्तार कर सकते हैं? मैंने इसे 'टेक्स्ट' के रूप में एक बहुत लंबी स्ट्रिंग पास की, और यह अगली पंक्ति में लपेट नहीं गया। –

+0

@ हसनबाग ने स्ट्रिंग में ब्रेक का उपयोग किया था? उदाहरण के लिए: "Lorem Ipsum प्रिंटिंग \ n और टाइपसेटिंग उद्योग का बस डमी \ n पाठ है।" –

+0

पाठ उपयोगकर्ता इनपुट से आ रहा है, और इस तरह वे अगली पंक्ति निर्दिष्ट करने के लिए ब्रेक का उपयोग नहीं कर रहे हैं। मुझे खुद को ओवरफ्लो संभालना होगा। –

3

स्वीकार्य उत्तर फ़ॉन्ट को मापने के बिना पाठ को लपेटता है (अधिकतम 40 वर्ण, कोई फर्क नहीं पड़ता कि फ़ॉन्ट आकार और बॉक्स चौड़ाई क्या है), इसलिए परिणाम केवल अनुमानित हैं और आसानी से बॉक्स को भर सकते हैं या फिर से भर सकते हैं। https://gist.github.com/turicas/1455973

+0

यह सबसे अच्छा जवाब है। हमें स्वीकार्य उत्तर बदलने की कोशिश करनी चाहिए क्योंकि इसे 6 साल पहले स्वीकार किया गया था .. –

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