text="任何屁话,\n只要被打印出来\n就成了真理"
python
廖雪峰的网站上有PIL的使用教程,可是他的安装地址是直接引到PIL的官方网站的。查看了PIL的官网,发现官方支持好像仅仅作到了python2.7的部分。因此我在pycharm上面搜索到了适配python3.x的包,他好像改叫Pillow。他们的历史渊源(pillow是PIL的一个派生分支,如今发展的更好)我就不去考虑了,可是他的加载仍是和PIL彻底同样的,包括内部模块的加载,几乎没有区别。json
pip install Pillow
真实的过程是:如今内存中生成一张图片,将须要的文字绘制到这个图片上,再将图片保存到指定位置python3.x
import os import Image,ImageDraw,ImageFont,ImageFilter import random BASE_DIR=os.path.dirname(os.getcwd()) text="任何屁话,\n只要被打印出来\n就成了真理" # 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,因此在个人测试中,并无出现这种状况。dom
记得测试一下这个
im.show()
由于我如今不肯定这个方法的具体做用是什么python2.7
# 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的性能差别)。字体