天天看點

【pygame】pygame和PIL子產品實作文字圖檔化pygame和PIL子產品實作文字圖檔化

pygame和PIL子產品實作文字圖檔化

text="任何屁話,\n隻要被列印出來\n就成了真理"

使用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="任何屁話,\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,是以在我的測試中,并沒有出現這種情況。

記得測試一下這個

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

繼續閱讀