如何使用Python将文本转为图片
2025-05-12 15:02:30
在使用PYTHON把文字变成图片时,会遇到中文生成乱码的问题, 这时候就需要另外的插件来搞定。
因为PIL 的一个 bug,PIL 目前的版本中,不能正确处理非 ASCII 字符的点阵字体的渲染。对于像宋体这样的字体来说,只有 >= 18px 时,才会被当作矢量字体处理,也就是说只有当字体 >= 18px 时,文字才能正常显示。
增大字体虽然解决了汉字不能正常显示的问题,但还是没有解决我们一开始的初衷:使用点阵字体进行渲染。但是,这个目标使用现阶段的 PIL 似乎有点难以实现了。
Python 的第三方模块或组件非常多,可用来绘图的除了 PIL 之外,就还有 Pycairo、matplotlib、pyGame 等。在这儿,我使用 pyGame 来完成点阵字体的渲染工作。
所以可以把PYGAME与PIL结合起来使用。
import os
import stringIo
import Image, ImageFont,ImageDraw
import pygame
pygame .init()
text=u"这是一段测试交本,test 123。
im=Image new("RGB",(300,50),(255.255,255))#dr = ImageDraw.Draw(im
#font =ImageFont truetype(os path ioin("fonts""simsum ttc")18font =pygame font Font(os path join("fonts","simsun ttc"),14)
#drtext(10,5),text,font=font,fill="#000000"rtext=font.render(text,True,(0,0,0),(255,255,255)
#pygame image save(rtextt gif")sio=stringIo.stringI0()pygame image save(rtext, sio)sio seek(o)
line = Image.open(sio)im pastecline (10.5)
im.showim save("t png")
原理很简单,先将文字用 pyGame 渲染为图片,将渲染结果保存在一个 StringIO 对象中,然后再用 PIL 加载它。使用 StringIO 的好处是,一切操作都是在内存中进行的,不需要先将它保存到硬盘再用 PIL 读取,因为硬盘 IO 的效率相对来说是比较低的。
发表评论: