使用Python脚本将文字转换为图片的实例分享

作者:老杰 时间:2022-07-20 14:33:29 

有时候,我们需要将文本转换为图片,比如发长微博,或者不想让人轻易复制我们的文本内容等时候。目前类似的工具已经有了不少,不过我觉得用得都不是很趁手,于是便自己尝试实现了一个。

在 Python 中,PIL (Python Imaging Library) 是最常用的绘图库,自然地,尝试从 PIL 开始。

使用 PIL 将文字转换为图片

说转换其实并不恰当,真实的过程是:先在内存中生成一张图片,将需要的文字绘制到这个图片上,再将图片保存到指定位置。代码如下:


# -*- coding: utf-8 -*-

import os
import Image, ImageFont, ImageDraw

text = u"这是一段测试文本,test 123。"

im = Image.new("RGB", (300, 50), (255, 255, 255))
dr = ImageDraw.Draw(im)
font = ImageFont.truetype(os.path.join("fonts", "msyh.ttf"), 14)

dr.text((10, 5), text, font=font, fill="#000000")

im.show()
im.save("t.png")

生成的图片如下:

使用Python脚本将文字转换为图片的实例分享

杯具发生了,汉字没有正常显示!

网上搜索了一圈,发现这好像是 PIL 的一个 bug,PIL 目前的版本中,不能正确处理非 ASCII 字符的点阵字体的渲染。对于像宋体这样的字体来说,只有 >= 18px 时,才会被当作矢量字体处理,也就是说只有当字体 >= 18px 时,文字才能正常显示:


font = ImageFont.truetype(os.path.join("fonts", "simsun.ttc"), 18)

效果如下:

使用Python脚本将文字转换为图片的实例分享

增大字体虽然解决了汉字不能正常显示的问题,但还是没有解决我们一开始的初衷:使用点阵字体进行渲染。但是,这个目标使用现阶段的 PIL 似乎有点难以实现了。

使用 pyGame 渲染点阵字体

Python 的第三方模块或组件非常多,可用来绘图的除了 PIL 之外,就还有Pycairo、matplotlib、pyGame 等。在这儿,我使用 pyGame 来完成点阵字体的渲染工作。

代码如下:


# -*- coding: utf-8 -*-

import os
import pygame

pygame.init()

text = u"这是一段测试文本,test 123。"
font = pygame.font.Font(os.path.join("fonts", "simsun.ttc"), 14)
rtext = font.render(text, True, (0, 0, 0), (255, 255, 255))

pygame.image.save(rtext, "t.jpg")

效果如下:

使用Python脚本将文字转换为图片的实例分享

可以看到,使用 pyGame ,点阵字体的问题终于搞定了。

结合 PIL 和 pyGame

pyGame 虽然可以解决点阵字体的渲染问题,但讲到对图片的处理,还是 PIL 更为强大。那么,我们为什么不把两者结合起来呢?用 pyGame 渲染点阵字体,然后用 PIL 生成整张图片。

代码如下:


# -*- coding: utf-8 -*-

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.join("fonts", "simsun.ttc"), 18)
font = pygame.font.Font(os.path.join("fonts", "simsun.ttc"), 14)

#dr.text((10, 5), text, font=font, fill="#000000")
rtext = font.render(text, True, (0, 0, 0), (255, 255, 255))

#pygame.image.save(rtext, "t.gif")
sio = StringIO.StringIO()
pygame.image.save(rtext, sio)
sio.seek(0)

line = Image.open(sio)
im.paste(line, (10, 5))

im.show()
im.save("t.png")

原理很简单,先将文字用 pyGame 渲染为图片,将渲染结果保存在一个 StringIO 对象中,然后再用 PIL 加载它。使用 StringIO 的好处是,一切操作都是在内存中进行的,不需要先将它保存到硬盘再用 PIL 读取,因为硬盘 IO 的效率相对来说是比较低的。

最终效果如下:

使用Python脚本将文字转换为图片的实例分享

到这儿,使用 Python 将文本转为图片的功能就基本实现了,用到了 PIL 和 pyGame。

当然,上面的代码还只解决了最基本的问题,一个真正可用的文本转图片工具,还应该解决以下问题:长文本换行问题、英文单词断字问题、标点符号换行问题等。关于这些问题的分析篇幅也不短,这一次就先略过了。下面是一个综合考虑了诸多因素之后生成的《荷塘月色》的效果图:

使用Python脚本将文字转换为图片的实例分享

标签:Python,图片
0
投稿

猜你喜欢

  • IE与Firefox的CSS兼容大全

    2008-01-31 15:36:00
  • 访问javascript私有变量

    2010-01-19 13:56:00
  • ASP获取刚插入记录的自动编号ID

    2008-11-17 20:41:00
  • 跨平台、多浏览器页面测试

    2008-06-24 11:54:00
  • 适合所有网站的rss和xml聚合功能asp代码

    2011-04-06 11:19:00
  • FrontPage服务器扩展

    2008-03-05 13:05:00
  • 模拟兼容性的 addDOMLoadEvent 事件

    2009-07-31 12:37:00
  • 如何防止Application对象在多线程访问中出现错误?

    2009-11-22 19:18:00
  • PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】

    2023-07-23 02:36:20
  • asp压缩access数据库(带密码)方法

    2007-09-06 19:48:00
  • 在漏洞利用Python代码真的很爽

    2023-11-24 15:57:29
  • 理解HTTP消息头

    2008-12-10 14:06:00
  • asp随机生成文件名的函数

    2009-02-11 13:41:00
  • my.ini(my.cnf)与mysql优化指南

    2009-12-15 16:20:00
  • phpMyAdmin 2.10.2 配置方法

    2007-08-22 08:11:00
  • asp利用Split函数进行多关键字检索

    2011-03-16 11:10:00
  • Golang 高效排序数据详情

    2023-06-23 08:23:41
  • ASP实现控制虚拟主机功能的函数ADSI

    2008-10-12 13:12:00
  • es6函数之严格模式用法实例分析

    2023-08-09 06:15:40
  • 客户端JavaScript代码封装

    2008-12-26 18:10:00
  • asp之家 网络编程 m.aspxhome.com