【pygame】pygame和PIL模块实现文字图片化

pygame和PIL模块实现文字图片化

text="任何屁话, 只要被打印出来 就成了真理"

使用PIL模块

廖雪峰的网站上有PIL的使用教程,但是他的安装地址是直接引到PIL的官方网站的。查看了PIL的官网,发现官方支持好像仅仅做到了python2.7的部分。所以我在pycharm上面搜索到了适配python3.x的包,他好像改叫Pillow。他们的历史渊源(pillow是PIL的一个派生分支,现在发展的更好)我就不去考虑了,但是他的加载还是和PIL完全一样的,包括内部模块的加载,几乎没有区别。

  • 安装:pip install Pillow

使用PIL将文字转化为图片

真实的过程是:现在内存中生成一张图片,将需要的文字绘制到这个图片上,再将图片保存到指定位置

import os
import Image,ImageDraw,ImageFont,ImageFilter
import random
BASE_DIR=os.path.dirname(os.getcwd())

text="任何屁话,
只要被打印出来
就成了真理"


# PIL实现
width=60*4
height=60*2
im=Image.new('RGB',(width,height),(255,255,255))
dr=ImageDraw.Draw(im)
font=ImageFont.truetype(os.path.join('fonts',BASE_DIR+"\resources\minijson.ttf"),20)
dr.text((10,5),text,font=font,fill='#000000')
im.show()
im.save("t.png")

在我看的教程中,PIL还是那个适配2.7的原生库,它好像有一个“不能正确处理非ASCII字符的点阵字体的渲染,对于宋体这样的字体来说,只有>=18px,才会被当做适量字体处理”的bug。
但是因为我使用的是pillow,所以在我的测试中,并没有出现这种情况。

记得测试一下这个im.show()因为我现在不确定这个方法的具体作用是什么

使用pygame将文字转换为图片

# pygame实现
import pygame
pygame.init()

font1=pygame.font.Font(os.path.join('fonts',BASE_DIR+"\resources\minijson.ttf"),20)
rtext=font1.render(text,True,(0,0,0),(255,255,255))
pygame.image.save(rtext,"f.jpg")

可以发现这种方法和直接用PIL模块的步骤差异还是不小的。
PIL更像是:设置一块画板---->绘制图案(文字字体)---->生成图片
pygame则是:设置一个字体---->给设置的字体赋予内容---->将文字生成图片

生成的效果也是显而易见的不同。PIL有一块固定的画板,这块画板不按照字多字少而产生变化,字多他不会跟着长大,字少他也不会适应缩小
但是pygame就不一样,他好像并没有按照我设置的换行符\n跟着变化,仅仅显示一行,刚刚好是这行内容的长度。
所以pygame这个font模块还是需要深入了解一下:

  • 如何让他支持换行?
  • 是否支持自定义画板大小?
  • 更高级的,这以上两种方式,如何支持文本的格式化,支持换行段落排版?

内存内生成图片的案例

# -*- 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))
font = pygame.font.Font(os.path.join("fonts", "simsun.ttc"), 14)

rtext = font.render(text, True, (0, 0, 0), (255, 255, 255))

sio = StringIO.StringIO()
pygame.image.save(rtext, sio)
sio.seek(0)

line = Image.open(sio)
im.paste(line, (10, 5))

im.show()
im.save("c.png")

将文字先用pygame渲染成图片,将渲染结果保存在一个stringIO对象中,然后再用PIL加载他。使用stringIO的好处是,一切操作都是在内存中进行的,不需要先将它保存到硬盘(考虑到硬盘IO和内存IO的性能差异)。

原文地址:https://www.cnblogs.com/scott-lv/p/7807055.html