python将文字转换成图片_使用Python脚本将文字转换为图片的实例分享
使用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脚本将文字转换为图片的实例分享相关推荐
- python unix时间戳转换成时间_关于python:将unix时间戳字符串转换为可读日期
我有一个用python表示unix时间戳(即"1284101485")的字符串,我想把它转换成一个可读的日期.当我使用time.strftime时,我得到一个TypeError: ...
- 计算机怎么把文字转换成表格,Word文档如何将文字转换成表格形式
一.将Word中文字转换成表格(以Word2003为例) 将文字转换成表格(表格:一或多列储存格,通常用于显示数字及其他项目,以供快速参照及分析.表格中项目的组织形式是列及行)时,要以逗点.tab或其 ...
- python怎么把列表转换成字符串_如何将字节列表(unicode)转换为Python字符串?
将字节序列转换为Unicode字符串是通过在该str(在Python 2.x中)或字节(Python 3.x)对象上调用decode()方法来完成的. 如果你实际上有一个字节列表,那么,为了获得这个对 ...
- 电子表格转换成数据库_创建数据库,将电子表格转换为关系数据库,第1部分...
电子表格转换成数据库 Part 1: Creating an Entity Relational Diagram (ERD) 第1部分:创建实体关系图(ERD) A Relational Databa ...
- python将中文转换成utf8_如何在python中从unicode转换成utf8?
我正在编写python脚本,从sqlite3数据库中提取xbmc媒体应用程序的数据.在 我可以看到,在我的代码中,它将使用unicode对象提取数据,其中我将有字符串(u'.u和{}.在 我想把它转换 ...
- python 图片文字转换成word_Python实现PDF转Words(文字提取)
起因 最近报了一个PMP的培训班,然后呢,给我的一些资料是PDF文档,且不可以复制,那么,我自己的学习整理的时候,就有点不方便,所以想把PDF中的文字提取出来. 犹记得还在读书的时候,老师为了将PDF ...
- python文本内容怎么转换成字典_怎么把照片上的文字转换成文本?照片转换文字神器来了...
照片上的文字是不可以直接编辑的,更别提复制粘贴了,有时候确实需要这么文字该怎么办呢?今天小编给大家推荐一个照片转文字神器,那就是闪电OCR图片文字识别软件. 闪电OCR图片文字识别软件是专门用 ...
- python字符串转换成整数_在Python中将字符串转换为整数的方法
在本文中,我们将向你展示如何将Python字符串转换为整数,可在Linux操作平台上进行.Python中的所有数据类型(包括整数和字符串)都是对象,通常在编写Python代码时,你需要将一种数据类型转 ...
- python label background设置成透明_纯Python绘制满满艺术感的山脊地图
点击上方"蓝字"关注我们 Python大数据分析 记录 分享 成长 添加微信号"CNFeffery"加入技术交流群 ❝ 本文示例代码及附件已上传至我的G ...
- python根据经纬度转换详细地址_使用python实现地址-经纬度转换
标签:地址 ref uri port div 字符 注册 gui 图片 中文领域: 指的是提取境内地址的经纬度,的主要调用的是百度API.中间经历了一些波折,刚开始直接 ...
最新文章
- Servlet,过滤器,监听器,拦截器的区别
- java.lang中所有的类_java.lang中的数学类
- [Step By Step]SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)
- 根文件系统使用登录模式
- 基于深度学习的IRS辅助MIMO通信系统的CSI压缩及恢复研究
- 网易云信-新增自定义消息(iOS版)
- 容器服kubernetes_Kubernetes,标准化和安全性主导2017年Linux容器新闻
- 信息系统项目管理师---运筹学计算
- linux中sed和find,Linux运维知识之Linux 之 sed 与 find 命令结合使用
- mysql 如何把整列数据*10_10张图告诉你,MySQL 是如何查找数据的?
- 【NOIP2004】【Luogu1085】不高兴的津津
- ov5640帧率配置_OV5640摄像头的数据处理配置流程(一)
- 数字孪生3D可视化智慧化社区管理平台
- Android选择DNK出现“NDK does not contain any platforms”
- Android字符设备驱动开发基于高通msm8916【原创 】
- oc 管理工具 黑苹果 下载_灵越7590黑苹果(win10下)
- Event Driven Class OSAL 基于事件驱动的模拟操作系统
- 计算机沟通管理技巧,语言沟通技巧
- 商务智能-第六章 数据挖掘
- 华为 SWE 实习岗 笔试题 JAVA
热门文章
- A DIRT-T APPROACH TO UNSUPERVISED DOMAIN ADAPTATION
- 哪所985计算机专业招文科,4张表看透36所985大学自主招生专业,收藏起来做备考材料!...
- 进制转化(二进制,八进制,十进制,十六进制)详细教程
- 多元有序logistic回归分析_SPSS:二元Logistic回归中自变量的处理和解读——有序多分类变量的处理...
- Linux 之四 Ubuntu 20.04 WiFi 无法使用、设置无法显示、远程桌面、常用快捷键、SSH、Git、PPA、FFmpeg 等各问题记录
- 怎么更换linux桌面管理,切换窗口管理器/桌面环境?
- ckeditor java 使用_CKEditor的使用
- 那些年 用过的经典App
- python 伯努利分布
- 一路走好——稻盛和夫先生