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

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

使用 PIL 将文字转换为图片

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# -*- 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")

生成的图片如下:

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

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

?

1

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

效果如下:

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

使用 pyGame 渲染点阵字体

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

代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

# -*- 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")

效果如下:

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

结合 PIL 和 pyGame

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

代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

# -*- 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 将文本转为图片的功能就基本实现了,用到了 PIL 和 pyGame。

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

python图片转换成文字_使用Python脚本将文字转换为图片的实例分享相关推荐

  1. python字符串转换成整数_在Python中将字符串转换为整数的方法

    在本文中,我们将向你展示如何将Python字符串转换为整数,可在Linux操作平台上进行.Python中的所有数据类型(包括整数和字符串)都是对象,通常在编写Python代码时,你需要将一种数据类型转 ...

  2. php 将图片转成二进制,php怎么把图片转换成二进制_后端开发

    php如何去掉数组的key_后端开发 在PHP中可以使用"array_values"函数去掉数组的key,该函数的作用就是返回包含数组中所有的值的数组,其语法是"arra ...

  3. opencv把图片转换成二进制_如何增强图像,然后使用Python和OpenCV将其转换为二进制图像?...

    我创建了一个简单的例子来说明我要做的事情:#!/usr/bin/python #------------------------------------------------------------ ...

  4. python文本内容怎么转换成字典_怎么把照片上的文字转换成文本?照片转换文字神器来了...

      照片上的文字是不可以直接编辑的,更别提复制粘贴了,有时候确实需要这么文字该怎么办呢?今天小编给大家推荐一个照片转文字神器,那就是闪电OCR图片文字识别软件.   闪电OCR图片文字识别软件是专门用 ...

  5. python十六进制转换成八进制_怎么把十六进制转化为八进制

    展开全部 八进制与十六进制之间的转换32313133353236313431303231363533e4b893e5b19e31333366303831有两种方法: 第一种:他们之间的转换可以先转成二 ...

  6. python pdf 转换成txt,csv,doc 及doc转换为pdf初级

    pdf,搜索相关路径下pdf文档,把pdf文档移动到指定的路径下,再对该路径下的pdf文档进行转换 缺点:无法转换带有图片的pdf文档,转换后的文档格式问题 安装相应的库 1)pip install ...

  7. 电子表格转换成数据库_创建数据库,将电子表格转换为关系数据库,第1部分...

    电子表格转换成数据库 Part 1: Creating an Entity Relational Diagram (ERD) 第1部分:创建实体关系图(ERD) A Relational Databa ...

  8. html 图片转换成word,在Word中通过把编辑的图片另存为HTML文件实现转换图片

    Word是文字处理软件,它和图片格式转换根本就占不上边啊?如何能转换图片呢?在正常情况下Acdsee确实是图片浏览.格式转换的好工具,但是如果你的机器里没有安装它,却要进行图片转换怎么呢?这样我们的W ...

  9. python unix时间戳转换成时间_关于python:将unix时间戳字符串转换为可读日期

    我有一个用python表示unix时间戳(即"1284101485")的字符串,我想把它转换成一个可读的日期.当我使用time.strftime时,我得到一个TypeError: ...

  10. python 将图片转换成像素画_Python用61行代码实现图片像素化

    起因 看到网上的像素图片,感觉蛮有趣的,就打算用python一些PIL类库写一个. 实现思路 把一张图片分成多个块,每个块的颜色都等于这个色块中颜色最多的颜色,如下图. 这个图取2×2的像素为块的大小 ...

最新文章

  1. 大脑模拟NLP,高德纳奖得主Papadimitriou:神经元集合演算用于句子解析
  2. Python 循环控制语句-break/continue
  3. MongoDB自动删除过期数据--TTL索引
  4. 实时搜索 elasticsearch vs solr
  5. java基础--网络编程
  6. python是在linux系统下运行的吗_Linux系统下python代码运行shell命令的方法
  7. Palindromic Twist(CF-1027A)
  8. C语言分支语句和循环语句及练习
  9. Android开发笔记(十六)秋千摇摆动画SwingAnimation
  10. 响应式web设计之CSS3 Media Queries
  11. 计算机系统基础知识——校验码之海明码(Hamming Code)
  12. 【转】Android 9 Pie 兼容性常见问题及注意事项
  13. 不知为不知--信息论和最大熵原则
  14. 知识图谱可视化工具选型
  15. Android实现圆形图片 真菜鸟食用
  16. YBTOJ反素数洛谷P1463(数论)
  17. 产品经理必读:敏捷开发中的需求管理过程全解
  18. android 点击变色的两种情况、textview点击变色以及自定义checkbox
  19. html大文件传输思路
  20. Spring源码:Advice接口

热门文章

  1. js正则匹配可见字符
  2. SAP 取销售订单行的已发货数量
  3. 怎样查看已分好区的硬盘的分配单元大小
  4. 一楼二楼教师办公室图书馆操场计算机房,新PEP人教版四年级英语下册常用单词、常用表达法默写用纸...
  5. 自定义JS加载等待动画loading
  6. 局域网 网线连接 的布线方法
  7. 关于喇叭的选型及设计流程
  8. JAVA一头母羊的寿命是5年_母羊生小羊,N年有多少羊问题
  9. (附源码)spring boot养老院系统 645488
  10. 西安航空学院计算机专业代码,西安航空职业技术学院专业代码