Python 将文本转换为图像

Python 将文本转换为图像,python,python-3.x,text,formatting,format,Python,Python 3.x,Text,Formatting,Format,我一直在开发一个从文本文件中读取文本的程序。在阅读文本后,我想将文本转换为图像,但具有随机属性,如字体样式、大小等。问题是输出图像不应超过700(图像宽度)和100(图像高度)。选择的随机字体较大时,文本尺寸超出限制(水平和垂直) 我想要的是调整段落宽度,以便它可以水平放置,当它超过垂直放置时,只需包含那些可以在高度限制中放置的文本 我当前的代码所做的是,当文本大小超过时,它会随机选择另一个较小的字体,这样它就不会超过尺寸限制。这不是我想要的,因为它只能用小字体复制文本 from PIL imp

我一直在开发一个从文本文件中读取文本的程序。在阅读文本后,我想将文本转换为图像,但具有随机属性,如字体样式、大小等。问题是输出图像不应超过
700(图像宽度)
100(图像高度)
。选择的随机字体较大时,文本尺寸超出限制(水平和垂直)

我想要的是调整段落宽度,以便它可以水平放置,当它超过垂直放置时,只需包含那些可以在高度限制中放置的文本

我当前的代码所做的是,当文本大小超过时,它会随机选择另一个较小的字体,这样它就不会超过尺寸限制。这不是我想要的,因为它只能用小字体复制文本

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
从PIL导入图像
从PIL导入ImageDraw
从PIL导入ImageFont
从随机输入种子
从随机导入randint
将numpy作为np导入
导入操作系统路径
#图像的恒定尺寸。
图像宽度=700
图像高度=1000
#返回以宽度和高度表示的文本大小。
def getSize(文本,字体):
testImg=Image.new('RGB',(1,1))
testDraw=ImageDraw.Draw(testImg)
返回testDraw.textsize(txt,字体)
#将白色背景图像中文本的XY坐标随机化。
def get_xy_坐标(文本、字体):
宽度,高度=getSize(文本,字体)
xy=(randint(1,图像宽度-宽度),randint(1,图像高度-高度))
返回xy
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
种子()
文件\u计数器=1
字体=“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利亚利.ttf”、“阿里亚利亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.ttf”、“阿里亚利.TT威尔达naz.ttf','VERDREF.ttf']
尽管如此:
打印(文件计数器)
如果不是os.path.isfile('text/'+str(文件计数器)+'.txt'):
打破
text=open('text/'+str(文件计数器)+“.txt”,encoding=“utf8”)
text=text.read()
font\u number=randint(0,25)
fontname='字体/'+字体[字体编号]
#将文本尺寸限制为训练和测试图像的恒定最大尺寸。
尽管如此:
fontsize=randint(10,50)
font=ImageFont.truetype(fontname,fontsize)
宽度,高度=getSize(文本,字体)
如果(宽度<图像宽度)和(高度<图像高度):
打破
#创建具有恒定大小的白色背景的图像。
img=Image.new('RGB',(图像宽度,图像高度),'white')
d=图像绘制。绘制(img)
#d、 文本(获取xy坐标(文本,字体),文本,填充='黑色',字体=字体)
保存(“文本图像/”+str(文件计数器)+“.png”)
文件计数器=文件计数器+1
注:

对于使用的文本文件

对于使用的字体文件


注意:文本文件的内容各不相同。有些包含很少的单词,有些包含很多单词。我不想扭曲文本的宽度和高度纵横比。

您是否可以尝试渲染图像,而不考虑格式,然后将其压缩到最大尺寸(无论哪个尺寸超过限制)?不确定这是一个限制还是不可接受的。只需要一个这是一个起点。@zerecees->谢谢,但我不想以任何方式扭曲文本的宽度和高度纵横比。明白了。您可以按比例调整图像的宽度/高度,使其保持纵横比。但是,我假设这也不起作用。您实际上是在尝试创建词云吗?您可以尝试渲染图像吗RDlesses->谢谢,但我不想以任何方式扭曲文本的宽度和高度纵横比。明白了。你可以调整图像的宽度/高度比例一般来说,它保持了纵横比。但是,我认为这也行不通。你实际上是在尝试创建一个单词云吗?