Найти - Пользователи
Полная версия: py2img оптимальный алгоритм
Начало » Python для новичков » py2img оптимальный алгоритм
1
igor.kaist
Доброго времени суток!
Возникла задача “нарисовать” на картинке с заданной шириной текст.
Из условий: мы знаем, сколько занимает пикселов отдельная буква (текст)
Вот мой набросок кода, решение “в лоб” (используется библиотека 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
Ferroman
Может, делить таки на слова, но при наличии слова длиннее ширины картинки уменьшать шрифт надписи?
igor.kaist
На слова поделил, соответственно быстродействие улучшилось, так как гораздо меньше вызовов 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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB