Форум сайта python.su
Доброго времени суток!
Возникла задача “нарисовать” на картинке с заданной шириной текст.
Из условий: мы знаем, сколько занимает пикселов отдельная буква (текст)
Вот мой набросок кода, решение “в лоб” (используется библиотека 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()
Офлайн
Может, делить таки на слова, но при наличии слова длиннее ширины картинки уменьшать шрифт надписи?
Офлайн
На слова поделил, соответственно быстродействие улучшилось, так как гораздо меньше вызовов 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()
Офлайн