Я разрабатываю программу, которая читает текст из текстового файла. После прочтения текста я хочу преобразовать текст в изображение, но со случайными атрибутами, такими как стиль шрифта, размер и многое другое. Дело в том, что выходное изображение не должно превышать 700(image_width)
и 100(image_height)
. Когда выбранный случайный шрифт большой, размер текста превышает ограничение (по горизонтали и вертикали).
Мне нужно настроить ширину абзаца так, чтобы он мог соответствовать по горизонтали, а когда он превышает по вертикали, просто включить те текст, который можно вставить в ограничение по высоте.
Что мой текущий код делает, когда размер текста превышает, он выбирает другой случайный шрифт меньшего размера, чтобы он не превышал предел размера. Это не то, что я хочу, так как он будет воспроизводить текст только мелкими шрифтами.
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from random import seed
from random import randint
import numpy as np
import os.path
#Constant dimensions of the image.
image_width = 700
image_height = 1000
#Returns the text size in terms of width and height.
def getSize(txt, font):
testImg = Image.new('RGB', (1, 1))
testDraw = ImageDraw.Draw(testImg)
return testDraw.textsize(txt, font)
#Randomize XY coordinate of the text in white background image.
def get_xy_coordinates(text, font):
width, height = getSize(text, font)
xy = (randint(1, image_width - width), randint(1, image_height - height ))
return xy
if __name__ == '__main__':
seed()
file_counter = 1
fonts = ['arial.ttf', 'arialbd.ttf', 'arialbi.ttf', 'ariali.ttf', 'ARIALN.TTF', 'ARIALNB.TTF', 'ARIALNBI.TTF', 'ARIALNI.TTF','ariblk.ttf','ARLRDBD.TTF','georgia.ttf','georgiab.ttf','georgiai.ttf','georgiaz.ttf','GRGAREF.TTF','OCRAEXT.TTF','OCRAStd.otf', 'times.ttf','timesbd.ttf','timesbi.ttf','timesi.ttf','verdana.ttf','verdanab.ttf','verdanai.ttf','verdanaz.ttf', 'VERDREF.TTF']
while True:
print(file_counter)
if not os.path.isfile('text/' + str (file_counter) + '.txt'):
break
text = open('text/' + str (file_counter) + ".txt", encoding="utf8")
text = text.read()
font_number = randint(0,25)
fontname = 'fonts/' + fonts[font_number]
#Limits text dimension to constant maximum dimensions of training and testing images.
while True:
fontsize = randint(10, 50)
font = ImageFont.truetype(fontname, fontsize)
width, height = getSize(text, font)
if (width < image_width) and (height < image_height):
break
#Creates an image with white background of constant size.
img = Image.new('RGB', (image_width, image_height), 'white')
d = ImageDraw.Draw( img)
#d.text(get_xy_coordinates(text, font), text, fill='black', font=font)
img.save("text_images/" + str(file_counter) + ".png")
file_counter = file_counter + 1
Примечания:
Ссылка для используемых текстовых файлов.
Ссылка для используемых файлов шрифтов.
Примечание. Содержание текстовых файлов различается. Некоторые содержат мало слов, некоторые много. Я не хочу искажать соотношение сторон по ширине и высоте текста.