目录

前言

一、两类解决方法

二、具体示例代码

1.pygame库

2.PIL库

总结



前言

有一次在知乎上看到一篇有关家庭照顾痴呆老人的帖子,其中有个作者的回复让我很感慨,因此想保存成图片并分享给其他朋友。结果用wps将文本转成图片时,竟然要VIP会员才行。这我肯定是花不起这小钱的,所以直接想到用Python来实现这一功能。


提示:以下是本篇文章正文内容,下面案例可供参考

一、两类解决方法

关于如何将文字转成图片的相关wiki总结,网上有很多,大致可以分为这样两类:

1、使用pygame库

2、使用PIL库

二、具体示例代码

1.pygame库

代码如下(示例):

# encoding: utf-8

import pygame
import os

# pygame初始化
pygame.init()
# 待转换文字
with open('word.txt', 'r', encoding='utf-8')as f:
    text = f.read()
# 设置字体和字号
font = pygame.font.SysFont(os.path.join("C:\\Windows\\Fonts\\", "simhei.ttf"), 64)
# 渲染图片,设置背景颜色和字体样式,前面的颜色是字体颜色
ftext = font.render(text, True, (65, 83, 130), (255, 255, 255))
# 保存图片
pygame.image.save(ftext, "word.jpg")  # 图片保存地址

但是遇到2个问题:中文乱码和图片内容不规则。

对于中文乱码问题,很自然地想到是编码格式问题,尝试过u"{}".format(text)或者text.encode('gbk')、更换字体tff格式等方法都失败了。网上搜索了下,使用pygame库的帖子下面都有人在问,如何解决中文乱码如何解决。

因此,本人放弃了,是通过第2种方法实现的。

2.PIL库

简单说下代码逻辑:

(1)为了保证图片能和word格式一致,经常需要保证图片的长、宽与原word字数一致,因此通过

(fontSize * max_len), len(liens) * (fontSize + 5)来保证图片长宽

(2)因为我个人喜欢白底黑字,因此设置图片背景为(255,255,255),字体为#000000。如果不清楚要对应颜色的RGB值,可以在https://www.runoob.com/html/html-colors.html 上进行查询。

代码如下(示例):

from PIL import Image, ImageFont, ImageDraw
import os


def CreateImg(text, max_len):
    fontSize = 30
    liens = text.split('\n')
    # 画布颜色
    im = Image.new("RGB", ((fontSize * max_len), len(liens) * (fontSize + 5)), (255, 255, 255))
    dr = ImageDraw.Draw(im)
    # 字体样式
    fontPath = os.path.join("C:\\Windows\\Fonts\\", "simhei.ttf")

    font = ImageFont.truetype(fontPath, fontSize)
    # 文字颜色
    dr.text((0, 0), text, font=font, fill="#000000")
    im.save('output.png')
    im.show()


with open('word.txt', 'r', encoding='utf-8')as f:
    text = f.read()
with open('word.txt', 'r', encoding='utf-8')as f:
    text_temp = f.readlines()
max_len = 0
for i, s in enumerate(text_temp):
    if len(s) > max_len:
        max_len = len(s)
print(max_len)
CreateImg(text, max_len)

效果如下:

word 转文本 python python将word文档转图片_示例代码

 总体来说,图片能满足我的要求。


总结

这篇wiki总结本身没什么大的难度,只是记录下,为了方便后续遇到相同诉求的同学能快速实现。

另外,就是对那篇知乎帖子感触较深,做个记录。