编程派微信号:codingpy

文 / oldj

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

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

1、使用 PIL 将文字转换为图片

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

代码如下:

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 时,文字才能正常显示:

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

效果如下:

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

2、使用 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")

效果如下:

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

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

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

python 文本文件转图片_使用Python将文本转为图片相关推荐

  1. python文字转图片_技能:如何使用Python将文本转为图片

    更多腾讯海量技术文章,请关注云加社区:https://cloud.tencent.com/developer/column 作者:CDA数据分析师 摘要:有时候,我们需要将文本转换为图片,比如发长微博 ...

  2. python文字转图片_Python 将文本转为图片

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

  3. python docx 合并文档 图片_使用python抓取大量简历文档内数据(word:docx;pdf;图片等)输出表格文件...

    1. 文章背景描述: 近期公司有员工离职了,技术岗位的. 让HR招人,招聘进度也太慢了,实在等不及,就撸起袖子自己上.(之前从来没招聘过) 自己在某招聘网站注册后,花了若干人民币,短时间收到大量求职者 ...

  4. python爬去百度图片_爬虫篇| 爬取百度图片(一)

    什么是爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模 ...

  5. python 还原九宫格图片_用Python做一个好玩的朋友圈九宫格抽奖

    最近在朋友圈看到个好玩的抽奖九宫格: 随便点开一个: 设计思路 以朋友圈中看到的1号图做参考,我们需要准备 300*900 的白色底图,搞笑表情图,广告语,中间一个醒目的数字编号,外加下方的嘲讽&qu ...

  6. 用python爬虫爬取无水印图片_使用python 爬虫,爬取图片

    一.需求: 用python实现去内涵段子里面下载网页当中的图片到本地当中 二.实现: 1.获取要爬取的URL地址 2.设置headers 3.请求网页内容,把html内容转换成XML 4.解析地址内容 ...

  7. 如何使用python批量压缩图片_利用Python 批量压缩图片

    方法一 直接调整宽高 先放参考资料:如何用Python智能批量压缩图片? import math from glob import glob from PIL import Image import ...

  8. python是动态语言图片_利用python图片生成,需10几行代码,生成的动态表情包(小黄鸭)...

    小编找到了10几行的,好玩的动态表情包生成的代码.分享分享! 这个程序怎么做呢?不要急,来听我给大家分析分析. 工具:程序环境 语言:Python 3.6 编辑器:Pycharm 程序步骤 实现字符动 ...

  9. python 存储图片_使用python存储网页上的图片实例

    使用python存储网页上的图片实例 本文介绍在已知网络图片的地址下,存储图片到本地 本文例子随便选择LOFTER上一张图片,复制图片的地址,如下图所示 在Python中输入代码 import req ...

最新文章

  1. python 字符串大小写相关函数
  2. 万能门店小程序_关于传统门店开发微信小程序的优势
  3. CentOS 7 设置IP地址无效
  4. TIOBE 3 月编程语言:Swift 一路低走,Java 份额大跌
  5. Java web(2012/2/23)
  6. Linux下静态库.a与.so库文件的生成与使用
  7. 学成在线(一)项目介绍
  8. 手机定位折腾记(1):安卓手机的网络定位与NetworkLocation.apk
  9. 信号计算机联锁试题,计算机联锁试题.doc
  10. Visual Studio扩展开发(VS插件)
  11. c 语言打印26个大写字母怎么读,26个大写字母读法
  12. MapReducer Counter计数器的使用,Combiner ,Partitioner,Sort,Grop的使用,
  13. jsp报错500解决办法
  14. POJ1008 玛雅历
  15. 把妹之道于品牌营销“精屁”
  16. 3款好用的知识库软件,帮你解决私有化部署,老板抓紧收藏
  17. 中职计算机教学方法,浅谈中职计算机学科的教学方法:英语课教学方法有哪些...
  18. 用html和js编写人机象棋对战
  19. L2-025 分而治之
  20. Codeforces Round #764 (Div. 3)(A~G)

热门文章

  1. JAVA实现石头剪刀布的游戏
  2. Adobe中国摄影计划,助力Adobe国际认证学员,提升数字体验
  3. 倒计时2天,和V神一起点燃这个夏天
  4. android检测代理,防止别人抓包
  5. zabbix监控Linux流程
  6. 报错Cause: java.sql.sQLException:请求的转换无效
  7. SwiftUI Device Management 基础教程
  8. 网付扫码点餐助力实体门店数字化营销,走出数字经营的第一步
  9. Bootstrap导航栏始终固定在页面顶部
  10. 关于error handling的一些理解