Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 7, 2009 16:45:34

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

py2img оптимальный алгоритм

Доброго времени суток!
Возникла задача “нарисовать” на картинке с заданной шириной текст.
Из условий: мы знаем, сколько занимает пикселов отдельная буква (текст)
Вот мой набросок кода, решение “в лоб” (используется библиотека 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()
Но возникла проблема - перенос слов. В принципе проблему можно решить, деля текст не на буквы, а целиком на слова ( f.split() ), тогда возникает проблема с возможными “словами”, длиннее ширины картинки, да и код этот показался мне не достаточно быстрым.
Может кто подскажет более быстрый алгоритм.
P.S. Сторонние библиотеки использовать затруднительно, так как результат должен работать на pys60, где есть только функция measure_text - аналог textsize в PIL



Офлайн

#2 Июнь 9, 2009 14:46:47

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

py2img оптимальный алгоритм

Может, делить таки на слова, но при наличии слова длиннее ширины картинки уменьшать шрифт надписи?

Офлайн

#3 Июнь 9, 2009 16:11:26

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

py2img оптимальный алгоритм

На слова поделил, соответственно быстродействие улучшилось, так как гораздо меньше вызовов 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()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version