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

来源:中文源码网    浏览: 次    日期:2018年9月2日

【下载文档:  使用Python脚本将文字转换为图片的实例分享.txt 】

(友情提示:右键点上行txt文档名->目标另存为)

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

在 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")

生成的图片如下:

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

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

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

效果如下:

增大字体虽然解决了汉字不能正常显示的问题,但还是没有解决我们一开始的初衷:使用点阵字体进行渲染。但是,这个目标使用现阶段的 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")

效果如下:

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

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

亲,试试微信扫码分享本页! *^_^*

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

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

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

  2. 计算机怎么把文字转换成表格,Word文档如何将文字转换成表格形式

    一.将Word中文字转换成表格(以Word2003为例) 将文字转换成表格(表格:一或多列储存格,通常用于显示数字及其他项目,以供快速参照及分析.表格中项目的组织形式是列及行)时,要以逗点.tab或其 ...

  3. python怎么把列表转换成字符串_如何将字节列表(unicode)转换为Python字符串?

    将字节序列转换为Unicode字符串是通过在该str(在Python 2.x中)或字节(Python 3.x)对象上调用decode()方法来完成的. 如果你实际上有一个字节列表,那么,为了获得这个对 ...

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

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

  5. python将中文转换成utf8_如何在python中从unicode转换成utf8?

    我正在编写python脚本,从sqlite3数据库中提取xbmc媒体应用程序的数据.在 我可以看到,在我的代码中,它将使用unicode对象提取数据,其中我将有字符串(u'.u和{}.在 我想把它转换 ...

  6. python 图片文字转换成word_Python实现PDF转Words(文字提取)

    起因 最近报了一个PMP的培训班,然后呢,给我的一些资料是PDF文档,且不可以复制,那么,我自己的学习整理的时候,就有点不方便,所以想把PDF中的文字提取出来. 犹记得还在读书的时候,老师为了将PDF ...

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

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

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

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

  9. python label background设置成透明_纯Python绘制满满艺术感的山脊地图

    点击上方"蓝字"关注我们 Python大数据分析 记录   分享   成长 添加微信号"CNFeffery"加入技术交流群 ❝ 本文示例代码及附件已上传至我的G ...

  10. python根据经纬度转换详细地址_使用python实现地址-经纬度转换

    标签:地址   ref   uri   port   div   字符   注册   gui   图片 中文领域: 指的是提取境内地址的经纬度,的主要调用的是百度API.中间经历了一些波折,刚开始直接 ...

最新文章

  1. Servlet,过滤器,监听器,拦截器的区别
  2. java.lang中所有的类_java.lang中的数学类
  3. [Step By Step]SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)
  4. 根文件系统使用登录模式
  5. 基于深度学习的IRS辅助MIMO通信系统的CSI压缩及恢复研究
  6. 网易云信-新增自定义消息(iOS版)
  7. 容器服kubernetes_Kubernetes,标准化和安全性主导2017年Linux容器新闻
  8. 信息系统项目管理师---运筹学计算
  9. linux中sed和find,Linux运维知识之Linux 之 sed 与 find 命令结合使用
  10. mysql 如何把整列数据*10_10张图告诉你,MySQL 是如何查找数据的?
  11. 【NOIP2004】【Luogu1085】不高兴的津津
  12. ov5640帧率配置_OV5640摄像头的数据处理配置流程(一)
  13. 数字孪生3D可视化智慧化社区管理平台
  14. Android选择DNK出现“NDK does not contain any platforms”
  15. Android字符设备驱动开发基于高通msm8916【原创 】
  16. oc 管理工具 黑苹果 下载_灵越7590黑苹果(win10下)
  17. Event Driven Class OSAL 基于事件驱动的模拟操作系统
  18. 计算机沟通管理技巧,语言沟通技巧
  19. 商务智能-第六章 数据挖掘
  20. 华为 SWE 实习岗 笔试题 JAVA

热门文章

  1. A DIRT-T APPROACH TO UNSUPERVISED DOMAIN ADAPTATION
  2. 哪所985计算机专业招文科,4张表看透36所985大学自主招生专业,收藏起来做备考材料!...
  3. 进制转化(二进制,八进制,十进制,十六进制)详细教程
  4. 多元有序logistic回归分析_SPSS:二元Logistic回归中自变量的处理和解读——有序多分类变量的处理...
  5. Linux 之四 Ubuntu 20.04 WiFi 无法使用、设置无法显示、远程桌面、常用快捷键、SSH、Git、PPA、FFmpeg 等各问题记录
  6. 怎么更换linux桌面管理,切换窗口管理器/桌面环境?
  7. ckeditor java 使用_CKEditor的使用
  8. 那些年 用过的经典App
  9. python 伯努利分布
  10. 一路走好——稻盛和夫先生