Форум сайта python.su
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png) 
			 
							 3
  3   
								
								Доброго времени суток!
Возникла задача “нарисовать” на картинке с заданной шириной текст.
Из условий: мы знаем, сколько занимает пикселов отдельная буква (текст)
Вот мой набросок кода, решение “в лоб” (используется библиотека PIL)
import Image
import ImageDraw
import ImageFont
f=open('sample.txt').read().decode('cp1251').replace('\r','')
# создаем изображение 1х1
temp=Image.new('RGB',(1,1))
t=ImageDraw.ImageDraw(temp)
# выбираем шрифт
font=ImageFont.truetype('Arial.ttf',int(15))
buf=''
out=[]
# проходимся по тексту
for x in f:
if t.textsize(buf,font=font)[0]<340 and x<>'\n':
# если текст еще уместится в строку, добавляем символ
buf=buf+x
else:
# иначе "переносим" на следующую строку
out.append(buf)
buf=x.replace('\n','')
# создаем новое изображение...
img=Image.new('RGB',(360,len(out)*17),0xffffff)
draw=ImageDraw.ImageDraw(img)
# рисуем текст построчно
for x in xrange(len(out)):
draw.text((3,x*17),out[x],fill='black',font=font)
img.show()
Офлайн
 
							 1
  1   
								
								Может, делить таки на слова, но при наличии слова длиннее ширины картинки уменьшать шрифт надписи?
Офлайн
 
							 3
  3   
								
								На слова поделил, соответственно быстродействие улучшилось, так как гораздо меньше вызовов textsize
По  поводу изменения шрифта не совсем подходит… Хотя не забить ли мне на это… Вот рабочий набросок с вариантом разбиением на слова…
#-*-coding:cp1251-*-
import Image
import ImageDraw
import ImageFont
f=open('sample.txt').read().decode('cp1251').replace('\r','').split(' ')
temp=Image.new('RGB',(1,1))
t=ImageDraw.ImageDraw(temp)
font=ImageFont.truetype('Arial.ttf',int(15))
buf=''
out=[]
count=0
for x in f:
size=t.textsize(x+' ',font=font)[0]
if '\n' in x:
out.append(buf+x.split('\n')[0])
buf=x.split('\n')[1]
count=size
elif size+count<360:
buf=buf+x+' '
count+=size
else:
out.append(buf)
buf=x+' '
count=size
out.append(buf)
img=Image.new('RGB',(360,len(out)*17),0xffffff)
draw=ImageDraw.ImageDraw(img)
for x in xrange(len(out)):
draw.text((3,x*17),out[x],fill='black',font=font)
img.show()
Офлайн
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png)