zoukankan      html  css  js  c++  java
  • 【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的性能差异)。

  • 相关阅读:
    【iOS】7.4 定位服务->2.1.1 定位
    【iOS】7.4 定位服务->1.0 简介
    1.2.1 OC概述
    5.1 网络基础
    4.4 多线程进阶篇<下>(NSOperation)
    4.3 多线程进阶篇<中>(GCD)
    4.1/4.2 多线程进阶篇<上>(Pthread & NSThread)
    4.0 多线程基础篇
    2.1 -1.0 Xcode(发布时间、使用、快捷键、插件相关)
    一款面试复习应用源码
  • 原文地址:https://www.cnblogs.com/scott-lv/p/7807055.html
Copyright © 2011-2022 走看看