【Python成长之路】 文字转图片(白底黑字,无中文乱码)

目录


前言

有一次在知乎上看到一篇有关家庭照顾痴呆老人的帖子,其中有个作者的回复让我很感慨,因此想保存成图片并分享给其他朋友。结果用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)

效果如下:

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

参考:《python 文字生成图片》《家有老年痴呆症的老人,我寒假回家才照顾了一个多星期,我已经快炸毛了,你们都是怎么忍受的呢》


总结

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

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

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值